#817 (three column layout)

- More progress on the story pages stuff.
This commit is contained in:
David Sinclair 2020-09-26 20:30:35 -07:00
parent 4a2a4ffb75
commit 8cc59dccf4
16 changed files with 425 additions and 127 deletions

View file

@ -1,5 +1,5 @@
//
// StoryPageObjCDelegate.h
// DetailObjCViewController.h
// NewsBlur
//
// Created by Samuel Clay on 11/2/12.
@ -14,7 +14,7 @@
@class StoryDetailViewController;
@interface StoryPageObjCDelegate : BaseViewController
@interface DetailObjCViewController : BaseViewController
<UIScrollViewDelegate, UIPopoverControllerDelegate, UIPopoverPresentationControllerDelegate, UIGestureRecognizerDelegate> {
NewsBlurAppDelegate *appDelegate;
THCircularProgressView *circularProgressView;

View file

@ -1,12 +1,12 @@
//
// StoryPageObjCDelegate.m
// DetailObjCViewController.m
// NewsBlur
//
// Created by Samuel Clay on 11/2/12.
// Copyright (c) 2012 NewsBlur. All rights reserved.
//
#import "StoryPageObjCDelegate.h"
#import "DetailObjCViewController.h"
#import "NewsBlurAppDelegate.h"
#import "FontSettingsViewController.h"
#import "UserProfileViewController.h"
@ -24,7 +24,7 @@
@import WebKit;
@interface StoryPageObjCDelegate ()
@interface DetailObjCViewController ()
@property (nonatomic) CGFloat statusBarHeight;
@property (nonatomic) BOOL wasNavigationBarHidden;
@ -34,7 +34,7 @@
@end
@implementation StoryPageObjCDelegate
@implementation DetailObjCViewController
@synthesize appDelegate;
@synthesize currentPage, nextPage, previousPage;
@ -90,9 +90,10 @@
currentPage.appDelegate = appDelegate;
nextPage.appDelegate = appDelegate;
previousPage.appDelegate = appDelegate;
currentPage.view.frame = self.scrollView.frame;
nextPage.view.frame = self.scrollView.frame;
previousPage.view.frame = self.scrollView.frame;
#warning commented out since not using scroll view
// currentPage.view.frame = self.scrollView.frame;
// nextPage.view.frame = self.scrollView.frame;
// previousPage.view.frame = self.scrollView.frame;
// NSLog(@"Scroll view content inset: %@", NSStringFromCGRect(self.scrollView.bounds));
// NSLog(@"Scroll view frame pre: %@", NSStringFromCGRect(self.scrollView.frame));

View file

@ -9,7 +9,7 @@
import UIKit
/// Manages the detail column of the split view, with the feed detail and/or the story pages.
class DetailViewController: BaseViewController {
class DetailViewController: DetailObjCViewController {
/// How the feed detail and story pages are laid out.
enum Layout {
/// The feed detail is to the left of the story pages (and managed by the split view, not here).
@ -44,6 +44,8 @@ class DetailViewController: BaseViewController {
updateLayout()
if let viewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController {
viewController.horizontalPageViewController = horizontalPageViewController
horizontalPageViewController?.setViewControllers([viewController], direction: .forward, animated: false, completion: nil)
}
}
@ -72,6 +74,8 @@ private extension DetailViewController {
if horizontalPageViewController == nil {
horizontalPageViewController = Storyboards.shared.controller(withIdentifier: .horizontalPages) as? HorizontalPageViewController
horizontalPageViewController?.detailViewController = self
add(viewController: horizontalPageViewController)
}
}
@ -82,7 +86,8 @@ private extension DetailViewController {
}
addChild(viewController)
view.addSubview(viewController.view)
// view.addSubview(viewController.view)
view.insertSubview(viewController.view, at: 0)
viewController.didMove(toParent: self)
}

View file

@ -8,21 +8,21 @@
import UIKit
#warning("hack: this function is just for testing")
func storyViewController() -> OriginalStoryViewController {
let viewController = OriginalStoryViewController()
if let appDelegate = UIApplication.shared.delegate as? NewsBlurAppDelegate {
let urls = ["https://dejal.com/", "https://dejus.com/", "https://yellowcottagehomestead.com/", "https://apple.com", "https://amazon.com"]
appDelegate.activeOriginalStoryURL = URL(string: urls.randomElement() ?? "https://dejal.com/")
}
_ = viewController.view
viewController.loadInitialStory()
return viewController
}
//#warning("hack: this function is just for testing")
//func storyViewController() -> OriginalStoryViewController {
// let viewController = OriginalStoryViewController()
//
// if let appDelegate = UIApplication.shared.delegate as? NewsBlurAppDelegate {
// let urls = ["https://dejal.com/", "https://dejus.com/", "https://yellowcottagehomestead.com/", "https://apple.com", "https://amazon.com"]
//
// appDelegate.activeOriginalStoryURL = URL(string: urls.randomElement() ?? "https://dejal.com/")
// }
//
// _ = viewController.view
// viewController.loadInitialStory()
//
// return viewController
//}
/// Delegate and data source of the story horizontal page view controller.
class HorizontalPageDelegate: NSObject {
@ -30,40 +30,41 @@ class HorizontalPageDelegate: NSObject {
extension HorizontalPageDelegate: UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let viewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController else {
guard let pageViewController = pageViewController as? HorizontalPageViewController, let detailViewController = pageViewController.detailViewController, let verticalViewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController else {
return nil
}
viewController.setViewControllers([storyViewController()], direction: .reverse, animated: false, completion: nil)
verticalViewController.setViewControllers([detailViewController.previousPage], direction: .reverse, animated: false, completion: nil)
//TODO: *** TO BE IMPLEMENTED *** CATALYST: set up the page controller
return viewController
return verticalViewController
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let viewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController else {
guard let pageViewController = pageViewController as? HorizontalPageViewController, let detailViewController = pageViewController.detailViewController, let verticalViewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController else {
return nil
}
viewController.setViewControllers([storyViewController()], direction: .forward, animated: false, completion: nil)
verticalViewController.setViewControllers([detailViewController.nextPage], direction: .forward, animated: false, completion: nil)
//TODO: *** TO BE IMPLEMENTED *** CATALYST: set up the page controller
return viewController
return verticalViewController
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int {
//TODO: *** TO BE IMPLEMENTED *** CATALYST
return 1
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
//TODO: *** TO BE IMPLEMENTED *** CATALYST
return 10
}
// Don't want the page dots.
// func presentationIndex(for pageViewController: UIPageViewController) -> Int {
// //TODO: *** TO BE IMPLEMENTED *** CATALYST
//
// return 1
// }
//
// func presentationCount(for pageViewController: UIPageViewController) -> Int {
// //TODO: *** TO BE IMPLEMENTED *** CATALYST
//
// return 10
// }
}
extension HorizontalPageDelegate: UIPageViewControllerDelegate {

View file

@ -10,5 +10,6 @@ import UIKit
/// Manages horizontal story pages. An instance of this is contained within `DetailViewController`.
class HorizontalPageViewController: UIPageViewController {
/// Weak reference to owning detail view controller.
weak var detailViewController: DetailViewController?
}

View file

@ -42,7 +42,7 @@
@property (nonatomic, strong) DashboardViewController *dashboardViewController;
@property (nonatomic, strong) StoryDetailViewController *storyDetailViewController;
@property (nonatomic, strong) OriginalStoryViewController *originalViewController;
@property (nonatomic, strong) StoryPageDelegate *storyPageControl;
@property (nonatomic, strong) DetailViewController *storyPageControl;
@property (nonatomic, strong) ShareViewController *shareViewController;
@property (nonatomic, strong) UIView *storyTitlesStub;
@property (readwrite) BOOL storyTitlesOnLeft;

View file

@ -34,7 +34,6 @@
@class FontSettingsViewController;
@class DetailViewController;
@class StoryDetailViewController;
@class StoryPageDelegate;
@class ShareViewController;
@class LoginViewController;
@class AddSiteViewController;
@ -82,7 +81,7 @@ SFSafariViewControllerDelegate> {
FontSettingsViewController *fontSettingsViewController;
StoryDetailViewController *storyDetailViewController;
StoryPageDelegate *storyPageControl;
DetailViewController *storyPageControl;
ShareViewController *shareViewController;
LoginViewController *loginViewController;
AddSiteViewController *addSiteViewController;
@ -182,7 +181,7 @@ SFSafariViewControllerDelegate> {
@property (nonatomic) IBOutlet FriendsListViewController *friendsListViewController;
@property (nonatomic) IBOutlet DetailViewController *detailViewController;
@property (nonatomic) IBOutlet StoryDetailViewController *storyDetailViewController;
@property (nonatomic) IBOutlet StoryPageDelegate *storyPageControl;
@property (nonatomic) IBOutlet DetailViewController *storyPageControl;
@property (nonatomic) IBOutlet LoginViewController *loginViewController;
@property (nonatomic, strong) UINavigationController *addSiteNavigationController;
@property (nonatomic) IBOutlet AddSiteViewController *addSiteViewController;

View file

@ -338,7 +338,7 @@
return self.feedsViewController;
} else if ([identifier isEqualToString:@"FeedDetailView"]) {
return self.feedDetailViewController;
} else if ([identifier isEqualToString:@"StoryPageDelegate"]) {
} else if ([identifier isEqualToString:@"DetailViewController"]) {
return self.storyPageControl;
} else if ([identifier isEqualToString:@"ContainerView"]) {
return self.masterContainerViewController;

View file

@ -1,14 +0,0 @@
//
// StoryPageDelegate.swift
// NewsBlur
//
// Created by David Sinclair on 2020-08-27.
// Copyright © 2020 NewsBlur. All rights reserved.
//
import UIKit
/// Delegate and data source of the story page controller.
/// NOTE: this will be replaced by VerticalPageDelegate.
class StoryPageDelegate: StoryPageObjCDelegate {
}

View file

@ -14,32 +14,33 @@ class VerticalPageDelegate: NSObject {
extension VerticalPageDelegate: UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let viewController = storyViewController()
guard let pageViewController = pageViewController as? VerticalPageViewController, let detailViewController = pageViewController.detailViewController else {
return nil
}
//TODO: *** TO BE IMPLEMENTED *** CATALYST: set up the story detail
return viewController
return detailViewController.previousPage
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let viewController = storyViewController()
guard let pageViewController = pageViewController as? VerticalPageViewController, let detailViewController = pageViewController.detailViewController else {
return nil
}
//TODO: *** TO BE IMPLEMENTED *** CATALYST: set up the story detail
return viewController
return detailViewController.nextPage
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int {
//TODO: *** TO BE IMPLEMENTED *** CATALYST
return 1
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
//TODO: *** TO BE IMPLEMENTED *** CATALYST
return 10
}
// Don't want the page dots.
// func presentationIndex(for pageViewController: UIPageViewController) -> Int {
// //TODO: *** TO BE IMPLEMENTED *** CATALYST
//
// return 1
// }
//
// func presentationCount(for pageViewController: UIPageViewController) -> Int {
// //TODO: *** TO BE IMPLEMENTED *** CATALYST
//
// return 10
// }
}
extension VerticalPageDelegate: UIPageViewControllerDelegate {

View file

@ -10,5 +10,11 @@ import UIKit
/// Manages vertical story pages. Instances of this are contained within `HorizontalPageViewController`.
class VerticalPageViewController: UIPageViewController {
/// Weak reference to owning horizontal page view controller.
weak var horizontalPageViewController: HorizontalPageViewController?
/// Weak computed reference to owning detail view controller.
weak var detailViewController: DetailViewController? {
return horizontalPageViewController?.detailViewController
}
}

View file

@ -15,7 +15,6 @@
170E3CCF24F8A5D8009CE819 /* SplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CCE24F8A5D8009CE819 /* SplitViewController.swift */; };
170E3CD124F8A664009CE819 /* SplitViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CD024F8A664009CE819 /* SplitViewDelegate.swift */; };
170E3CD324F8A89B009CE819 /* HorizontalPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CD224F8A89B009CE819 /* HorizontalPageViewController.swift */; };
170E3CD524F8A981009CE819 /* StoryPageDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CD424F8A981009CE819 /* StoryPageDelegate.swift */; };
170E3CD724F8AB0D009CE819 /* FeedDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CD624F8AB0D009CE819 /* FeedDetailViewController.swift */; };
1715D02B2166B3F900227731 /* PremiumManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1715D02A2166B3F900227731 /* PremiumManager.m */; };
1721C9D12497F91A00B0EDC4 /* mute_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 1721C9D02497F91900B0EDC4 /* mute_gray.png */; };
@ -429,7 +428,7 @@
FF688E4F16E6B3E1003B7B42 /* traverse_done@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF688E4D16E6B3E1003B7B42 /* traverse_done@2x.png */; };
FF688E5216E6B8D0003B7B42 /* traverse_background.png in Resources */ = {isa = PBXBuildFile; fileRef = FF688E5016E6B8D0003B7B42 /* traverse_background.png */; };
FF688E5316E6B8D0003B7B42 /* traverse_background@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF688E5116E6B8D0003B7B42 /* traverse_background@2x.png */; };
FF6A233216448E0700E15989 /* StoryPageObjCDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6A233116448E0700E15989 /* StoryPageObjCDelegate.m */; };
FF6A233216448E0700E15989 /* DetailObjCViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6A233116448E0700E15989 /* DetailObjCViewController.m */; };
FF6A23391644957800E15989 /* StoryPageControl.xib in Resources */ = {isa = PBXBuildFile; fileRef = FF6A23361644903900E15989 /* StoryPageControl.xib */; };
FF6DD31E1AEDF9F300F1F53A /* menu_icn_rename.png in Resources */ = {isa = PBXBuildFile; fileRef = FF6DD31C1AEDF9F300F1F53A /* menu_icn_rename.png */; };
FF6DD31F1AEDF9F300F1F53A /* menu_icn_rename@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF6DD31D1AEDF9F300F1F53A /* menu_icn_rename@2x.png */; };
@ -680,7 +679,6 @@
170E3CCE24F8A5D8009CE819 /* SplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewController.swift; sourceTree = "<group>"; };
170E3CD024F8A664009CE819 /* SplitViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewDelegate.swift; sourceTree = "<group>"; };
170E3CD224F8A89B009CE819 /* HorizontalPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalPageViewController.swift; sourceTree = "<group>"; };
170E3CD424F8A981009CE819 /* StoryPageDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryPageDelegate.swift; sourceTree = "<group>"; };
170E3CD624F8AB0D009CE819 /* FeedDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedDetailViewController.swift; sourceTree = "<group>"; };
1715D0292166B3F900227731 /* PremiumManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PremiumManager.h; sourceTree = "<group>"; };
1715D02A2166B3F900227731 /* PremiumManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PremiumManager.m; sourceTree = "<group>"; };
@ -1233,8 +1231,8 @@
FF688E4D16E6B3E1003B7B42 /* traverse_done@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "traverse_done@2x.png"; sourceTree = "<group>"; };
FF688E5016E6B8D0003B7B42 /* traverse_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = traverse_background.png; sourceTree = "<group>"; };
FF688E5116E6B8D0003B7B42 /* traverse_background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "traverse_background@2x.png"; sourceTree = "<group>"; };
FF6A233016448E0700E15989 /* StoryPageObjCDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoryPageObjCDelegate.h; sourceTree = "<group>"; };
FF6A233116448E0700E15989 /* StoryPageObjCDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoryPageObjCDelegate.m; sourceTree = "<group>"; };
FF6A233016448E0700E15989 /* DetailObjCViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetailObjCViewController.h; sourceTree = "<group>"; };
FF6A233116448E0700E15989 /* DetailObjCViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DetailObjCViewController.m; sourceTree = "<group>"; };
FF6A23361644903900E15989 /* StoryPageControl.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = StoryPageControl.xib; path = ../Classes/StoryPageControl.xib; sourceTree = "<group>"; };
FF6DD31C1AEDF9F300F1F53A /* menu_icn_rename.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_icn_rename.png; sourceTree = "<group>"; };
FF6DD31D1AEDF9F300F1F53A /* menu_icn_rename@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu_icn_rename@2x.png"; sourceTree = "<group>"; };
@ -1896,13 +1894,13 @@
431B857415A1324200DCE497 /* Story */ = {
isa = PBXGroup;
children = (
176A5C7924F8BD1B009E8DF9 /* DetailViewController.swift */,
FF6A233016448E0700E15989 /* DetailObjCViewController.h */,
FF6A233116448E0700E15989 /* DetailObjCViewController.m */,
170E3CD224F8A89B009CE819 /* HorizontalPageViewController.swift */,
172AD263251D901D000BB264 /* HorizontalPageDelegate.swift */,
172AD25D251D9011000BB264 /* VerticalPageViewController.swift */,
172AD269251D9028000BB264 /* VerticalPageDelegate.swift */,
170E3CD424F8A981009CE819 /* StoryPageDelegate.swift */,
FF6A233016448E0700E15989 /* StoryPageObjCDelegate.h */,
FF6A233116448E0700E15989 /* StoryPageObjCDelegate.m */,
1787082F24F8B3A50000C82B /* StoryDetailViewController.swift */,
7842ECF511D44A530066CF9D /* StoryDetailObjCViewController.h */,
7842ECF611D44A530066CF9D /* StoryDetailObjCViewController.m */,
@ -2384,7 +2382,6 @@
172AD273251D9F40000BB264 /* Storyboards.swift */,
170E3CCE24F8A5D8009CE819 /* SplitViewController.swift */,
170E3CD024F8A664009CE819 /* SplitViewDelegate.swift */,
176A5C7924F8BD1B009E8DF9 /* DetailViewController.swift */,
436ACA8B15BF1088004E01CC /* NBContainerViewController.h */,
436ACA8C15BF1088004E01CC /* NBContainerViewController.m */,
17432C7D1C533FBC003F8FD6 /* MenuViewController.h */,
@ -3507,7 +3504,6 @@
FFDE35CC161B8F870034BFDE /* FolderTitleView.m in Sources */,
172AD264251D901D000BB264 /* HorizontalPageDelegate.swift in Sources */,
E1C44B0B200147ED002128AD /* StoryTitleAttributedString.m in Sources */,
170E3CD524F8A981009CE819 /* StoryPageDelegate.swift in Sources */,
FFDE35DA161D12250034BFDE /* UnreadCountView.m in Sources */,
FF34FD621E9D93CB0062F8ED /* IASKMultipleValueSelection.m in Sources */,
FF4130A3162E10CF00DDB6A7 /* MenuTableViewCell.m in Sources */,
@ -3515,7 +3511,7 @@
17432C7F1C533FBC003F8FD6 /* MenuViewController.m in Sources */,
FFF8B3AF1F847505001AB95E /* NBDashboardNavigationBar.m in Sources */,
17E635AF1C548C580075338E /* FeedChooserItem.m in Sources */,
FF6A233216448E0700E15989 /* StoryPageObjCDelegate.m in Sources */,
FF6A233216448E0700E15989 /* DetailObjCViewController.m in Sources */,
FF67D3B2168924C40057A7DA /* TrainerViewController.m in Sources */,
FF1660CD16D6FD8A00AF8541 /* SmallInteractionCell.m in Sources */,
FF34FD6E1E9D93CB0062F8ED /* IASKTextField.m in Sources */,

View file

@ -12,6 +12,6 @@
#import "FeedsObjCViewController.h"
#import "FeedDetailObjCViewController.h"
#import "StoryPageObjCDelegate.h"
#import "DetailObjCViewController.h"
#import "StoryDetailObjCViewController.h"
#import "OriginalStoryViewController.h"

View file

@ -1,7 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="17154" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="17503.1" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
<device id="ipad9_7" orientation="portrait" layout="fullscreen" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17124"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17502"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@ -32,7 +34,6 @@
<outlet property="premiumViewController" destination="Nno-Ma-6TQ" id="0Ex-VU-Hek"/>
<outlet property="shareViewController" destination="168" id="272"/>
<outlet property="storyDetailViewController" destination="92" id="93"/>
<outlet property="storyPageControl" destination="290" id="292"/>
<outlet property="trainerViewController" destination="287" id="289"/>
<outlet property="userProfileViewController" destination="235" id="236"/>
<outlet property="userTagsViewController" destination="v2Q-Hh-f3K" id="5CE-5l-aoS"/>
@ -153,13 +154,6 @@
<outlet property="appDelegate" destination="3" id="271"/>
</connections>
</viewController>
<viewController restorationIdentifier="StoryPageControl" id="290" customClass="StoryPageDelegate">
<extendedEdge key="edgesForExtendedLayout"/>
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
<connections>
<outlet property="appDelegate" destination="3" id="291"/>
</connections>
</viewController>
<viewController restorationIdentifier="StoryDetailView" nibName="StoryDetailViewController" id="92" customClass="StoryDetailViewController">
<extendedEdge key="edgesForExtendedLayout"/>
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17503.1" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17124"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17502"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@ -33,7 +33,6 @@
<outlet property="premiumViewController" destination="GXC-Ze-HBm" id="wZ1-Qy-e0X"/>
<outlet property="shareViewController" destination="131" id="132"/>
<outlet property="storyDetailViewController" destination="92" id="173"/>
<outlet property="storyPageControl" destination="170" id="172"/>
<outlet property="trainerViewController" destination="174" id="176"/>
<outlet property="userProfileViewController" destination="141" id="142"/>
<outlet property="window" destination="12" id="78"/>
@ -68,14 +67,6 @@
</connections>
<point key="canvasLocation" x="-677" y="-1136"/>
</viewController>
<viewController restorationIdentifier="StoryPageControl" nibName="StoryPageControl" automaticallyAdjustsScrollViewInsets="NO" id="170" customClass="StoryPageDelegate">
<extendedEdge key="edgesForExtendedLayout"/>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
<connections>
<outlet property="appDelegate" destination="3" id="171"/>
</connections>
<point key="canvasLocation" x="-1564" y="-1165"/>
</viewController>
<viewController nibName="LoginViewController" id="102" userLabel="Login View Controller" customClass="LoginViewController">
<extendedEdge key="edgesForExtendedLayout"/>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>

View file

@ -14,27 +14,333 @@
<objects>
<viewController storyboardIdentifier="DetailViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="djW-7k-haK" customClass="DetailViewController" customModule="NewsBlur" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="jTZ-4O-xyT">
<rect key="frame" x="0.0" y="0.0" width="818.5" height="834"/>
<rect key="frame" x="0.0" y="0.0" width="818" height="834"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Us5-JA-7Ct">
<rect key="frame" x="305.5" y="401.5" width="208" height="61"/>
<string key="text">This will be the stories view
Coming soon!</string>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4vK-W4-ayS">
<rect key="frame" x="0.0" y="583" width="818.5" height="51"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="traverse_background.png" translatesAutoresizingMaskIntoConstraints="NO" id="PLd-RZ-773">
<rect key="frame" x="652.5" y="4" width="160" height="44"/>
<constraints>
<constraint firstAttribute="width" constant="160" id="SOi-6Y-1cH"/>
<constraint firstAttribute="height" constant="44" id="yra-hO-9Gh"/>
</constraints>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="traverse_background.png" translatesAutoresizingMaskIntoConstraints="NO" id="zfl-mN-y0T">
<rect key="frame" x="4" y="4" width="143" height="44"/>
<constraints>
<constraint firstAttribute="width" constant="143" id="v9X-2X-Bgb"/>
<constraint firstAttribute="height" constant="44" id="vg2-XI-Vnl"/>
</constraints>
</imageView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oct-Cn-9L0">
<rect key="frame" x="658.5" y="9" width="43" height="34"/>
<constraints>
<constraint firstAttribute="height" constant="34" id="8OI-gJ-c5x"/>
<constraint firstAttribute="width" constant="43" id="kNF-2d-gY1"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="20" maxY="0.0"/>
<state key="normal" backgroundImage="traverse_previous.png">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" backgroundImage="traverse_previous_off.png"/>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="doPreviousStory:" destination="djW-7k-haK" eventType="touchUpInside" id="pgb-NN-Zmi"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZoU-af-wjh">
<rect key="frame" x="702.5" y="9" width="104" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="104" id="Esh-zh-12I"/>
<constraint firstAttribute="height" constant="34" id="LWH-y8-6oO"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<inset key="titleEdgeInsets" minX="2" minY="0.0" maxX="0.0" maxY="0.0"/>
<state key="normal" title="NEXT" backgroundImage="traverse_next.png">
<color key="titleColor" red="0.51764705879999995" green="0.52549019610000003" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.49803921569999998" green="0.49803921569999998" blue="0.49803921569999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="selected">
<color key="titleColor" red="0.1969947517" green="0.1969947517" blue="0.1969947517" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="0.33333334329999997" green="0.33333334329999997" blue="0.33333334329999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="doNextUnreadStory:" destination="djW-7k-haK" eventType="touchUpInside" id="7Ye-5J-1dI"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Mhr-a8-MQd">
<rect key="frame" x="9" y="9" width="87" height="34"/>
<constraints>
<constraint firstAttribute="height" constant="34" id="8lr-m8-D43"/>
<constraint firstAttribute="width" constant="87" id="fH9-Ji-sL9"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<inset key="titleEdgeInsets" minX="16" minY="0.0" maxX="0.0" maxY="0.0"/>
<state key="normal" title="TEXT" backgroundImage="traverse_text.png">
<color key="titleColor" red="0.51726847890000005" green="0.52641934160000003" blue="0.5003217459" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="selected">
<color key="titleColor" red="0.1969947517" green="0.1969947517" blue="0.1969947517" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="0.33333334329999997" green="0.33333334329999997" blue="0.33333334329999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="toggleTextView:" destination="djW-7k-haK" eventType="touchUpInside" id="BcX-EA-coX"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Teu-p1-Gy0">
<rect key="frame" x="97" y="9" width="44" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="44" id="GHI-MI-CDD"/>
<constraint firstAttribute="height" constant="34" id="UIz-s9-jVY"/>
</constraints>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="13"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="20" maxY="0.0"/>
<state key="normal" backgroundImage="traverse_send.png">
<color key="titleColor" red="0.51726847890000005" green="0.52641934160000003" blue="0.5003217459" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="selected">
<color key="titleColor" red="0.1969947517" green="0.1969947517" blue="0.1969947517" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="0.33333334329999997" green="0.33333334329999997" blue="0.33333334329999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="openSendToDialog:" destination="djW-7k-haK" eventType="touchUpInside" id="9U3-UM-kcf"/>
</connections>
</button>
<activityIndicatorView opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" animating="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="wpt-1g-x7w">
<rect key="frame" x="708.5" y="16" width="20" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="20" id="GBn-Oz-urx"/>
<constraint firstAttribute="height" constant="20" id="wo2-Qz-ku4"/>
</constraints>
<color key="color" red="0.5383990407" green="0.54777079819999996" blue="0.51707810160000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</activityIndicatorView>
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="wpt-1g-x7w" secondAttribute="bottom" constant="15" id="03o-Tx-Ngx"/>
<constraint firstAttribute="trailing" secondItem="ZoU-af-wjh" secondAttribute="trailing" constant="12" id="9oi-95-ua5"/>
<constraint firstAttribute="bottom" secondItem="Teu-p1-Gy0" secondAttribute="bottom" constant="8" id="DhJ-Vd-Zos"/>
<constraint firstAttribute="bottom" secondItem="ZoU-af-wjh" secondAttribute="bottom" constant="8" id="F4M-Gs-4Q8"/>
<constraint firstAttribute="trailing" secondItem="PLd-RZ-773" secondAttribute="trailing" constant="6" id="KIb-u5-yKl"/>
<constraint firstItem="Mhr-a8-MQd" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="top" constant="9" id="Lm9-bw-Gae"/>
<constraint firstItem="wpt-1g-x7w" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="top" constant="16" id="Onq-vt-9IB"/>
<constraint firstItem="oct-Cn-9L0" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="top" constant="9" id="Sb8-ah-WTX"/>
<constraint firstAttribute="bottom" secondItem="PLd-RZ-773" secondAttribute="bottom" constant="3" id="XVE-t8-vex"/>
<constraint firstItem="Mhr-a8-MQd" firstAttribute="leading" secondItem="4vK-W4-ayS" secondAttribute="leading" constant="9" id="cUF-Cc-QxF"/>
<constraint firstAttribute="height" constant="51" id="eDx-IM-t3r"/>
<constraint firstAttribute="bottom" secondItem="Mhr-a8-MQd" secondAttribute="bottom" constant="8" id="elN-qs-zPt"/>
<constraint firstItem="Teu-p1-Gy0" firstAttribute="leading" secondItem="Mhr-a8-MQd" secondAttribute="trailing" constant="1" id="fVb-wU-tzk"/>
<constraint firstItem="ZoU-af-wjh" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="top" constant="9" id="fng-rP-yJD"/>
<constraint firstItem="ZoU-af-wjh" firstAttribute="leading" secondItem="oct-Cn-9L0" secondAttribute="trailing" constant="1" id="g6D-iX-NZ0"/>
<constraint firstAttribute="bottom" secondItem="oct-Cn-9L0" secondAttribute="bottom" constant="8" id="iUr-Cf-Q16"/>
<constraint firstItem="PLd-RZ-773" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="top" constant="4" id="kPd-Dz-5Mp"/>
<constraint firstItem="zfl-mN-y0T" firstAttribute="leading" secondItem="4vK-W4-ayS" secondAttribute="leading" constant="4" id="p37-nQ-da5"/>
<constraint firstItem="wpt-1g-x7w" firstAttribute="leading" secondItem="oct-Cn-9L0" secondAttribute="trailing" constant="7" id="pie-9C-6lc"/>
<constraint firstItem="Teu-p1-Gy0" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="top" constant="9" id="r6J-NM-Wih"/>
<constraint firstItem="ZoU-af-wjh" firstAttribute="leading" secondItem="oct-Cn-9L0" secondAttribute="trailing" constant="1" id="sAq-ce-nf3"/>
<constraint firstItem="zfl-mN-y0T" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="top" constant="4" id="u2K-Za-5uE"/>
<constraint firstItem="Teu-p1-Gy0" firstAttribute="leading" secondItem="Mhr-a8-MQd" secondAttribute="trailing" constant="1" id="vqy-97-fJY"/>
<constraint firstAttribute="bottom" secondItem="zfl-mN-y0T" secondAttribute="bottom" constant="3" id="zAW-8Q-Srb"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hfm-Pf-oeW">
<rect key="frame" x="329.5" y="512" width="160" height="44"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="traverse_background.png" translatesAutoresizingMaskIntoConstraints="NO" id="DhZ-K9-Ohx">
<rect key="frame" x="0.0" y="0.0" width="160" height="44"/>
<constraints>
<constraint firstAttribute="width" constant="160" id="pgM-aj-MFu"/>
<constraint firstAttribute="height" constant="44" id="whT-PJ-xOd"/>
</constraints>
</imageView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Xtc-sh-knL">
<rect key="frame" x="6" y="5" width="36" height="34"/>
<constraints>
<constraint firstAttribute="height" constant="34" id="2pi-Ji-rYh"/>
<constraint firstAttribute="width" constant="36" id="GUg-uM-GcI"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="20" maxY="0.0"/>
<state key="normal" backgroundImage="autoscroll_off.png">
<color key="titleColor" red="0.51764705879999995" green="0.52549019610000003" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" backgroundImage="traverse_previous_off.png"/>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="autoscrollDisable:" destination="djW-7k-haK" eventType="touchUpInside" id="xy6-pJ-Zar"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WoA-Tv-FTT">
<rect key="frame" x="43" y="5" width="36" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="36" id="DLV-4U-iIU"/>
<constraint firstAttribute="height" constant="34" id="hGu-E7-dg7"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="20" maxY="0.0"/>
<state key="normal" backgroundImage="autoscroll_resume.png">
<color key="titleColor" red="0.51764705879999995" green="0.52549019610000003" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" backgroundImage="traverse_previous_off.png"/>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="autoscrollPauseResume:" destination="djW-7k-haK" eventType="touchUpInside" id="nkL-6Z-mrc"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="x4P-S0-dR7">
<rect key="frame" x="80" y="5" width="36" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="36" id="kGz-Tf-Nfz"/>
<constraint firstAttribute="height" constant="34" id="wsh-s4-baM"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="20" maxY="0.0"/>
<state key="normal" backgroundImage="autoscroll_slower.png">
<color key="titleColor" red="0.51764705879999995" green="0.52549019610000003" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" backgroundImage="traverse_previous_off.png"/>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="autoscrollSlower:" destination="djW-7k-haK" eventType="touchUpInside" id="JIU-Gg-Lt9"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xZB-Qu-u2n">
<rect key="frame" x="117" y="5" width="37" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="37" id="Uc8-iE-dwS"/>
<constraint firstAttribute="height" constant="34" id="eBL-Sp-Fbq"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="13"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="20" maxY="0.0"/>
<state key="normal" backgroundImage="autoscroll_faster.png">
<color key="titleColor" red="0.51764705879999995" green="0.52549019610000003" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="disabled" backgroundImage="traverse_previous_off.png"/>
<state key="highlighted">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="autoscrollFaster:" destination="djW-7k-haK" eventType="touchUpInside" id="8aA-ma-ybu"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" constant="160" id="8JN-0x-Wxg"/>
<constraint firstItem="x4P-S0-dR7" firstAttribute="leading" secondItem="WoA-Tv-FTT" secondAttribute="trailing" constant="1" id="9d0-El-qfS"/>
<constraint firstItem="xZB-Qu-u2n" firstAttribute="centerY" secondItem="hfm-Pf-oeW" secondAttribute="centerY" id="Fum-wZ-lMO"/>
<constraint firstItem="Xtc-sh-knL" firstAttribute="leading" secondItem="DhZ-K9-Ohx" secondAttribute="leading" constant="6" id="LGD-tR-0md"/>
<constraint firstAttribute="height" constant="44" id="McX-ZT-Oa5"/>
<constraint firstItem="xZB-Qu-u2n" firstAttribute="leading" secondItem="x4P-S0-dR7" secondAttribute="trailing" constant="1" id="S9q-9z-hqL"/>
<constraint firstItem="WoA-Tv-FTT" firstAttribute="centerY" secondItem="hfm-Pf-oeW" secondAttribute="centerY" id="Uxl-g3-HeW"/>
<constraint firstItem="WoA-Tv-FTT" firstAttribute="leading" secondItem="Xtc-sh-knL" secondAttribute="trailing" constant="1" id="b8m-Mq-cvm"/>
<constraint firstItem="DhZ-K9-Ohx" firstAttribute="centerY" secondItem="hfm-Pf-oeW" secondAttribute="centerY" id="mrl-fB-AqE"/>
<constraint firstItem="DhZ-K9-Ohx" firstAttribute="centerX" secondItem="hfm-Pf-oeW" secondAttribute="centerX" id="nU9-HN-T6z"/>
<constraint firstItem="x4P-S0-dR7" firstAttribute="centerY" secondItem="hfm-Pf-oeW" secondAttribute="centerY" id="ngp-qt-zlU"/>
<constraint firstItem="Xtc-sh-knL" firstAttribute="centerY" secondItem="hfm-Pf-oeW" secondAttribute="centerY" id="yw5-gp-mD8"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tFd-Uv-aMP">
<rect key="frame" x="0.0" y="634" width="818.5" height="12"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qGY-je-8bb">
<rect key="frame" x="0.0" y="-1" width="818.5" height="1"/>
<color key="backgroundColor" red="0.75644385810000003" green="0.75644385810000003" blue="0.75644385810000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="rXL-Rl-xkq"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bSN-6S-SA0">
<rect key="frame" x="0.0" y="12" width="818.5" height="1"/>
<color key="backgroundColor" red="0.75644385810000003" green="0.75644385810000003" blue="0.75644385810000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="tto-L2-TaQ"/>
</constraints>
</view>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="drag_icon.png" translatesAutoresizingMaskIntoConstraints="NO" id="xeQ-Iz-FR0">
<rect key="frame" x="392.5" y="2" width="34" height="9"/>
<constraints>
<constraint firstAttribute="height" constant="9" id="dFD-2h-iag"/>
<constraint firstAttribute="width" constant="34" id="wAd-rJ-dVL"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" red="0.88797336819999995" green="0.89844107630000003" blue="0.86854457860000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="xeQ-Iz-FR0" firstAttribute="centerX" secondItem="tFd-Uv-aMP" secondAttribute="centerX" id="3tS-En-fH4"/>
<constraint firstAttribute="trailing" secondItem="qGY-je-8bb" secondAttribute="trailing" id="AOi-Da-ns0"/>
<constraint firstAttribute="height" constant="12" id="Laq-ik-g8M"/>
<constraint firstAttribute="bottom" secondItem="bSN-6S-SA0" secondAttribute="bottom" constant="-1" id="SMi-yf-Pon"/>
<constraint firstItem="xeQ-Iz-FR0" firstAttribute="top" secondItem="qGY-je-8bb" secondAttribute="bottom" constant="2" id="SOj-Op-4hQ"/>
<constraint firstItem="xeQ-Iz-FR0" firstAttribute="leading" secondItem="tFd-Uv-aMP" secondAttribute="leading" id="WIp-Ao-Khg"/>
<constraint firstItem="qGY-je-8bb" firstAttribute="top" secondItem="tFd-Uv-aMP" secondAttribute="top" constant="-1" id="Zef-QC-am2"/>
<constraint firstAttribute="trailing" secondItem="bSN-6S-SA0" secondAttribute="trailing" id="cLg-BL-SJm"/>
<constraint firstAttribute="trailing" secondItem="xeQ-Iz-FR0" secondAttribute="trailing" id="fbc-Ms-uFK"/>
<constraint firstItem="qGY-je-8bb" firstAttribute="leading" secondItem="tFd-Uv-aMP" secondAttribute="leading" id="z3d-ao-3Le"/>
<constraint firstItem="bSN-6S-SA0" firstAttribute="leading" secondItem="tFd-Uv-aMP" secondAttribute="leading" id="ztL-pU-MBH"/>
</constraints>
<variation key="default">
<mask key="constraints">
<exclude reference="WIp-Ao-Khg"/>
<exclude reference="fbc-Ms-uFK"/>
</mask>
</variation>
</view>
</subviews>
<viewLayoutGuide key="safeArea" id="a0o-Zh-Wop"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="Us5-JA-7Ct" firstAttribute="centerY" secondItem="a0o-Zh-Wop" secondAttribute="centerY" id="Qjc-di-UOY"/>
<constraint firstItem="Us5-JA-7Ct" firstAttribute="centerX" secondItem="a0o-Zh-Wop" secondAttribute="centerX" id="hnf-cE-mPJ"/>
<constraint firstItem="4vK-W4-ayS" firstAttribute="leading" secondItem="a0o-Zh-Wop" secondAttribute="leading" id="AFV-14-jnc"/>
<constraint firstItem="hfm-Pf-oeW" firstAttribute="centerX" secondItem="a0o-Zh-Wop" secondAttribute="centerX" id="Grz-1P-qjc"/>
<constraint firstItem="a0o-Zh-Wop" firstAttribute="trailing" secondItem="4vK-W4-ayS" secondAttribute="trailing" id="JVw-MX-f4R"/>
<constraint firstItem="tFd-Uv-aMP" firstAttribute="top" secondItem="4vK-W4-ayS" secondAttribute="bottom" id="YVh-UJ-d3j"/>
<constraint firstItem="a0o-Zh-Wop" firstAttribute="bottom" secondItem="tFd-Uv-aMP" secondAttribute="bottom" constant="168" id="c9d-f5-wud"/>
<constraint firstItem="a0o-Zh-Wop" firstAttribute="trailing" secondItem="tFd-Uv-aMP" secondAttribute="trailing" id="h2I-ng-gxc"/>
<constraint firstItem="tFd-Uv-aMP" firstAttribute="top" secondItem="hfm-Pf-oeW" secondAttribute="bottom" constant="78" id="phm-3P-lxo"/>
<constraint firstItem="tFd-Uv-aMP" firstAttribute="leading" secondItem="a0o-Zh-Wop" secondAttribute="leading" id="wzt-O8-Ild"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="OyA-BF-OGR"/>
<connections>
<outlet property="autoscrollBackgroundImageView" destination="DhZ-K9-Ohx" id="JlX-4q-aYI"/>
<outlet property="autoscrollBottomConstraint" destination="phm-3P-lxo" id="7kF-8R-ggC"/>
<outlet property="autoscrollDisableButton" destination="Xtc-sh-knL" id="HH8-tu-4lg"/>
<outlet property="autoscrollFasterButton" destination="xZB-Qu-u2n" id="ora-na-Jht"/>
<outlet property="autoscrollPauseResumeButton" destination="WoA-Tv-FTT" id="G89-JX-DAM"/>
<outlet property="autoscrollSlowerButton" destination="x4P-S0-dR7" id="5r5-Ix-oSv"/>
<outlet property="autoscrollView" destination="hfm-Pf-oeW" id="uLO-sQ-E0v"/>
<outlet property="bottomSize" destination="tFd-Uv-aMP" id="d0U-lI-Ukb"/>
<outlet property="bottomSizeHeightConstraint" destination="c9d-f5-wud" id="0kK-IS-Yql"/>
<outlet property="buttonNext" destination="ZoU-af-wjh" id="Bg3-Bc-32l"/>
<outlet property="buttonPrevious" destination="oct-Cn-9L0" id="GQY-2J-pfy"/>
<outlet property="buttonSend" destination="Teu-p1-Gy0" id="cLM-Zi-gs0"/>
<outlet property="buttonText" destination="Mhr-a8-MQd" id="bXI-fg-Y5m"/>
<outlet property="dragBarImageView" destination="xeQ-Iz-FR0" id="JfY-AN-erg"/>
<outlet property="loadingIndicator" destination="wpt-1g-x7w" id="6Re-nf-bHo"/>
<outlet property="prevNextBackgroundImageView" destination="PLd-RZ-773" id="adi-Gt-uX1"/>
<outlet property="textStorySendBackgroundImageView" destination="zfl-mN-y0T" id="lD1-7s-izZ"/>
<outlet property="traverseBottomConstraint" destination="YVh-UJ-d3j" id="gGi-RC-s2Z"/>
<outlet property="traverseView" destination="4vK-W4-ayS" id="yvU-Yp-1YP"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="AQD-wG-11i" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
@ -337,9 +643,20 @@ Coming soon!</string>
</scenes>
<resources>
<image name="all.png" width="19.5" height="12.5"/>
<image name="autoscroll_faster.png" width="37" height="34"/>
<image name="autoscroll_off.png" width="36" height="34"/>
<image name="autoscroll_resume.png" width="36" height="34"/>
<image name="autoscroll_slower.png" width="36" height="34"/>
<image name="big_world.png" width="30.719999313354492" height="30.719999313354492"/>
<image name="drag_icon.png" width="96" height="24"/>
<image name="nav_icn_add.png" width="49.454544067382812" height="64"/>
<image name="nav_icn_settings.png" width="15.359999656677246" height="12.239999771118164"/>
<image name="traverse_background.png" width="113" height="46"/>
<image name="traverse_next.png" width="104" height="34"/>
<image name="traverse_previous.png" width="43" height="34"/>
<image name="traverse_previous_off.png" width="43" height="34"/>
<image name="traverse_send.png" width="44" height="34"/>
<image name="traverse_text.png" width="94" height="34"/>
<image name="unread_blue.png" width="49.5" height="12.5"/>
<image name="unread_green.png" width="49" height="12.5"/>
<image name="unread_yellow.png" width="58" height="12.5"/>