mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
#817 (three column layout)
- Lots more progress on the detail view and other areas.
This commit is contained in:
parent
48ec924b9e
commit
2549a4cec5
21 changed files with 727 additions and 505 deletions
|
@ -38,9 +38,9 @@
|
|||
}
|
||||
|
||||
@property (nonatomic, strong) NewsBlurAppDelegate *appDelegate;
|
||||
@property (nonatomic) StoryDetailViewController *currentPage;
|
||||
@property (nonatomic) StoryDetailViewController *nextPage;
|
||||
@property (nonatomic) StoryDetailViewController *previousPage;
|
||||
//@property (nonatomic) StoryDetailViewController *currentPage;
|
||||
//@property (nonatomic) StoryDetailViewController *nextPage;
|
||||
//@property (nonatomic) StoryDetailViewController *previousPage;
|
||||
@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;
|
||||
@property (nonatomic, strong) IBOutlet UIPageControl *pageControl;
|
||||
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewTopConstraint;
|
||||
|
@ -99,8 +99,10 @@
|
|||
@property (nonatomic) BOOL currentlyTogglingNavigationBar;
|
||||
@property (nonatomic, readonly) BOOL isHorizontal;
|
||||
@property (nonatomic) BOOL temporarilyMarkedUnread;
|
||||
@property (nonatomic, readonly) NSInteger storiesCount;
|
||||
|
||||
- (void)resizeScrollView;
|
||||
- (BOOL)pageIndexIsValid:(NSInteger)pageIndex;
|
||||
- (void)applyNewIndex:(NSInteger)newIndex pageController:(StoryDetailViewController *)pageController;
|
||||
- (void)layoutForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
|
||||
- (void)updateStatusBarState;
|
||||
|
@ -109,7 +111,6 @@
|
|||
- (void)adjustDragBar:(UIInterfaceOrientation)orientation;
|
||||
|
||||
- (void)transitionFromFeedDetail;
|
||||
- (void)resetPages;
|
||||
- (void)hidePages;
|
||||
- (void)refreshPages;
|
||||
- (void)reorientPages;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -38,16 +38,86 @@ class DetailViewController: DetailObjCViewController {
|
|||
/// The horizontal page view controller.
|
||||
var horizontalPageViewController: HorizontalPageViewController?
|
||||
|
||||
/// Returns the currently displayed story view controller, or `nil` if none.
|
||||
@objc var currentStoryController: StoryDetailViewController? {
|
||||
return horizontalPageViewController?.currentController?.currentController
|
||||
}
|
||||
|
||||
/// Returns an array of all existing story view controllers.
|
||||
@objc var storyControllers: [StoryDetailViewController] {
|
||||
var controllers = [StoryDetailViewController]()
|
||||
|
||||
guard let pageViewController = horizontalPageViewController else {
|
||||
return controllers
|
||||
}
|
||||
|
||||
addStories(from: pageViewController.previousController, to: &controllers)
|
||||
addStories(from: pageViewController.currentController, to: &controllers)
|
||||
addStories(from: pageViewController.nextController, to: &controllers)
|
||||
|
||||
return controllers
|
||||
}
|
||||
|
||||
/// Returns an array of the previous, current, and next vertical page view controllers, each with the previous, current, and next story view controllers. Note that the top-level array will always have three values, but the inner arrays may have 0-3, depending on usage. This is mainly for debugging use.
|
||||
@objc var storyControllersMatrix: [[StoryDetailViewController]] {
|
||||
guard let pageViewController = horizontalPageViewController else {
|
||||
return [[]]
|
||||
}
|
||||
|
||||
var previousVerticalControllers = [StoryDetailViewController]()
|
||||
var currentVerticalControllers = [StoryDetailViewController]()
|
||||
var nextVerticalControllers = [StoryDetailViewController]()
|
||||
|
||||
addStories(from: pageViewController.previousController, to: &previousVerticalControllers)
|
||||
addStories(from: pageViewController.currentController, to: ¤tVerticalControllers)
|
||||
addStories(from: pageViewController.nextController, to: &nextVerticalControllers)
|
||||
|
||||
return [previousVerticalControllers, currentVerticalControllers, nextVerticalControllers]
|
||||
}
|
||||
|
||||
/// Calls a closure for each story view controller.
|
||||
///
|
||||
/// - Parameter handler: The closure to call; it takes a story controller as a parameter.
|
||||
@objc(updateStoryControllers:) func updateStoryControllers(handler:(StoryDetailViewController) -> Void) {
|
||||
for controller in storyControllers {
|
||||
handler(controller)
|
||||
}
|
||||
}
|
||||
|
||||
/// Resets all of the other story controllers from the current one.
|
||||
@objc func resetOtherStoryControllers() {
|
||||
horizontalPageViewController?.currentController = horizontalPageViewController?.currentController
|
||||
|
||||
navigationItem.titleView = nil
|
||||
}
|
||||
|
||||
/// Resets the page controllers to a blank state.
|
||||
@objc func resetPageControllers() {
|
||||
if let viewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController {
|
||||
viewController.horizontalPageViewController = horizontalPageViewController
|
||||
viewController.currentController = makeStoryController(for: -2)
|
||||
|
||||
horizontalPageViewController?.setViewControllers([viewController], direction: .forward, animated: false, completion: nil)
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new story view controller for the specified page index, and starts loading the content.
|
||||
///
|
||||
/// - Parameter pageIndex: The index of the story page.
|
||||
/// - Returns: A new `StoryDetailViewController` instance.
|
||||
func makeStoryController(for pageIndex: Int) -> StoryDetailViewController? {
|
||||
let storyController = StoryDetailViewController(pageIndex: pageIndex)
|
||||
|
||||
applyNewIndex(pageIndex, pageController: storyController)
|
||||
|
||||
return storyController
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
updateLayout()
|
||||
|
||||
if let viewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController {
|
||||
viewController.horizontalPageViewController = horizontalPageViewController
|
||||
|
||||
horizontalPageViewController?.setViewControllers([viewController], direction: .forward, animated: false, completion: nil)
|
||||
}
|
||||
resetPageControllers()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,6 +158,14 @@ private extension DetailViewController {
|
|||
addChild(viewController)
|
||||
// view.addSubview(viewController.view)
|
||||
view.insertSubview(viewController.view, at: 0)
|
||||
|
||||
//TODO: *** TO BE IMPLEMENTED ***: will want to use slightly different constraints for top & bottom layouts
|
||||
viewController.view.translatesAutoresizingMaskIntoConstraints = false
|
||||
viewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
|
||||
viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
||||
viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
|
||||
viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
|
||||
|
||||
viewController.didMove(toParent: self)
|
||||
}
|
||||
|
||||
|
@ -100,4 +178,20 @@ private extension DetailViewController {
|
|||
viewController.removeFromParent()
|
||||
viewController.view.removeFromSuperview()
|
||||
}
|
||||
|
||||
func addStories(from verticalPageController: VerticalPageViewController?, to controllers: inout [StoryDetailViewController]) {
|
||||
guard let verticalPageController = verticalPageController else {
|
||||
return
|
||||
}
|
||||
|
||||
addStory(verticalPageController.previousController, to: &controllers)
|
||||
addStory(verticalPageController.currentController, to: &controllers)
|
||||
addStory(verticalPageController.nextController, to: &controllers)
|
||||
}
|
||||
|
||||
func addStory(_ story: StoryDetailViewController?, to controllers: inout [StoryDetailViewController]) {
|
||||
if let story = story {
|
||||
controllers.append(story)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -464,7 +464,6 @@
|
|||
|
||||
if (appDelegate.inStoryDetail && self.isPhoneOrCompact) {
|
||||
appDelegate.inStoryDetail = NO;
|
||||
// [appDelegate.storyPageControl resetPages];
|
||||
[self checkScroll];
|
||||
}
|
||||
|
||||
|
@ -633,7 +632,7 @@
|
|||
[storiesCollection setStories:nil];
|
||||
[storiesCollection setFeedUserProfiles:nil];
|
||||
storiesCollection.storyCount = 0;
|
||||
[appDelegate.storyPageControl resetPages];
|
||||
[appDelegate.storyPageControl resetPageControllers];
|
||||
|
||||
storiesCollection.inSearch = NO;
|
||||
storiesCollection.searchQuery = nil;
|
||||
|
|
|
@ -65,8 +65,7 @@ UIGestureRecognizerDelegate, UISearchBarDelegate> {
|
|||
@property (nonatomic) IBOutlet UIBarButtonItem * addBarButton;
|
||||
@property (nonatomic) IBOutlet UIBarButtonItem * settingsBarButton;
|
||||
@property (nonatomic) IBOutlet UIBarButtonItem * activitiesButton;
|
||||
@property (nonatomic) IBOutlet UIBarButtonItem *userInfoBarButton;
|
||||
@property (nonatomic) IBOutlet UIBarButtonItem *userAvatarButton;
|
||||
@property (nonatomic) IBOutlet UIButton *userAvatarButton;
|
||||
@property (nonatomic) IBOutlet UILabel *neutralCount;
|
||||
@property (nonatomic) IBOutlet UILabel *positiveCount;
|
||||
@property (nonatomic) IBOutlet UILabel *userLabel;
|
||||
|
|
|
@ -78,7 +78,6 @@ static NSArray<NSString *> *NewsBlurTopSectionNames;
|
|||
@synthesize settingsBarButton;
|
||||
@synthesize activitiesButton;
|
||||
@synthesize userAvatarButton;
|
||||
@synthesize userInfoBarButton;
|
||||
@synthesize neutralCount;
|
||||
@synthesize positiveCount;
|
||||
@synthesize userLabel;
|
||||
|
@ -193,8 +192,7 @@ static NSArray<NSString *> *NewsBlurTopSectionNames;
|
|||
self.feedTitlesTable.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
self.feedTitlesTable.estimatedRowHeight = 0;
|
||||
|
||||
userAvatarButton.customView.hidden = YES;
|
||||
userInfoBarButton.customView.hidden = YES;
|
||||
userAvatarButton.hidden = YES;
|
||||
self.noFocusMessage.hidden = YES;
|
||||
|
||||
[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];
|
||||
|
@ -916,8 +914,7 @@ static NSArray<NSString *> *NewsBlurTopSectionNames;
|
|||
appDelegate.activeUserProfileId = [NSString stringWithFormat:@"%@", [appDelegate.dictSocialProfile objectForKey:@"user_id"]];
|
||||
appDelegate.activeUserProfileName = [NSString stringWithFormat:@"%@", [appDelegate.dictSocialProfile objectForKey:@"username"]];
|
||||
// appDelegate.activeUserProfileName = @"You";
|
||||
[appDelegate showUserProfileModal:[self.navigationItem.leftBarButtonItems
|
||||
objectAtIndex:1]];
|
||||
[appDelegate showUserProfileModal:self.navigationItem.titleView];
|
||||
}
|
||||
|
||||
- (IBAction)tapAddSite:(id)sender {
|
||||
|
@ -2250,7 +2247,7 @@ heightForHeaderInSection:(NSInteger)section {
|
|||
}
|
||||
|
||||
- (void)resetToolbar {
|
||||
self.navigationItem.leftBarButtonItem = nil;
|
||||
// self.navigationItem.leftBarButtonItem = nil;
|
||||
self.navigationItem.titleView = nil;
|
||||
self.navigationItem.rightBarButtonItem = nil;
|
||||
}
|
||||
|
@ -2275,34 +2272,30 @@ heightForHeaderInSection:(NSInteger)section {
|
|||
NSURL *imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@",
|
||||
[appDelegate.dictSocialProfile
|
||||
objectForKey:@"large_photo_url"]]];
|
||||
userAvatarButton = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"user"]
|
||||
target:self
|
||||
action:@selector(showUserProfile)];
|
||||
userAvatarButton.customView.frame = CGRectMake(0, yOffset + 1, 32, 32);
|
||||
userAvatarButton.width = 32;
|
||||
userAvatarButton = [UIButton systemButtonWithImage:[UIImage imageNamed:@"user"]
|
||||
target:self action:@selector((showUserProfile))];
|
||||
userAvatarButton.pointerInteractionEnabled = YES;
|
||||
userAvatarButton.accessibilityLabel = @"User info";
|
||||
userAvatarButton.accessibilityHint = @"Double-tap for information about your account.";
|
||||
|
||||
|
||||
NSMutableURLRequest *avatarRequest = [NSMutableURLRequest requestWithURL:imageURL];
|
||||
[avatarRequest addValue:@"image/*" forHTTPHeaderField:@"Accept"];
|
||||
[avatarRequest setTimeoutInterval:30.0];
|
||||
avatarImageView = [[UIImageView alloc] initWithFrame:userAvatarButton.customView.frame];
|
||||
avatarImageView = [[UIImageView alloc] initWithFrame:userAvatarButton.frame];
|
||||
typeof(self) __weak weakSelf = self;
|
||||
[avatarImageView setImageWithURLRequest:avatarRequest placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
|
||||
typeof(weakSelf) __strong strongSelf = weakSelf;
|
||||
image = [Utilities roundCorneredImage:image radius:6 convertToSize:CGSizeMake(32, 32)];
|
||||
[(UIButton *)strongSelf.userAvatarButton.customView setImage:image forState:UIControlStateNormal];
|
||||
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
|
||||
[(UIButton *)strongSelf.userAvatarButton setImage:image forState:UIControlStateNormal];
|
||||
|
||||
} failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nonnull response, NSError * _Nonnull error) {
|
||||
NSLog(@"Could not fetch user avatar: %@", error);
|
||||
}];
|
||||
|
||||
[userInfoView addSubview:userAvatarButton];
|
||||
|
||||
// self.navigationItem.leftBarButtonItem = userInfoBarButton;
|
||||
|
||||
// [userInfoView addSubview:userAvatarButton];
|
||||
|
||||
userLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, yOffset, userInfoView.frame.size.width, 16)];
|
||||
userLabel = [[UILabel alloc] initWithFrame:CGRectMake(48, yOffset, userInfoView.frame.size.width, 16)];
|
||||
userLabel.text = appDelegate.activeUsername;
|
||||
userLabel.font = userLabelFont;
|
||||
userLabel.textColor = UIColorFromRGB(0x404040);
|
||||
|
@ -2332,25 +2325,16 @@ heightForHeaderInSection:(NSInteger)section {
|
|||
|
||||
[userInfoView sizeToFit];
|
||||
|
||||
userInfoBarButton = [[UIBarButtonItem alloc]
|
||||
initWithCustomView:userInfoView];
|
||||
UIBarButtonItem *spacer = [[UIBarButtonItem alloc]
|
||||
initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
|
||||
target:nil
|
||||
action:nil];
|
||||
spacer.width = -8;
|
||||
self.navigationItem.leftBarButtonItems = @[spacer, userAvatarButton, userInfoBarButton];
|
||||
self.navigationItem.titleView = userInfoView;
|
||||
}
|
||||
|
||||
- (void)refreshHeaderCounts {
|
||||
if (!appDelegate.activeUsername) {
|
||||
userAvatarButton.customView.hidden = YES;
|
||||
userInfoBarButton.customView.hidden = YES;
|
||||
userAvatarButton.hidden = YES;
|
||||
return;
|
||||
}
|
||||
|
||||
userAvatarButton.customView.hidden = NO;
|
||||
userInfoBarButton.customView.hidden = NO;
|
||||
userAvatarButton.hidden = NO;
|
||||
[appDelegate.folderCountCache removeObjectForKey:@"everything"];
|
||||
|
||||
NSNumberFormatter *formatter = [NSNumberFormatter new];
|
||||
|
|
|
@ -388,7 +388,7 @@
|
|||
} else if (indexPath.row == 4) {
|
||||
[self.appDelegate openTrainStory:self.appDelegate.storyPageControl.fontSettingsButton];
|
||||
} else if (indexPath.row == 5) {
|
||||
[self.appDelegate.storyPageControl.currentPage openShareDialog];
|
||||
[self.appDelegate.storyPageControl.currentStoryController openShareDialog];
|
||||
} else if (indexPath.row == 6) {
|
||||
[self showFontList];
|
||||
}
|
||||
|
|
|
@ -30,43 +30,47 @@ class HorizontalPageDelegate: NSObject {
|
|||
|
||||
extension HorizontalPageDelegate: UIPageViewControllerDataSource {
|
||||
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
|
||||
guard let pageViewController = pageViewController as? HorizontalPageViewController, let detailViewController = pageViewController.detailViewController, let verticalViewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController else {
|
||||
guard let pageViewController = pageViewController as? HorizontalPageViewController, let currentViewController = viewController as? VerticalPageViewController, let detailViewController = pageViewController.detailViewController else {
|
||||
return nil
|
||||
}
|
||||
|
||||
verticalViewController.setViewControllers([detailViewController.previousPage], direction: .reverse, animated: false, completion: nil)
|
||||
let pageIndex = (currentViewController.pageIndex ?? -1) - 1
|
||||
let previousViewController = detailViewController.pageIndexIsValid(pageIndex) ? Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController : nil
|
||||
|
||||
//TODO: *** TO BE IMPLEMENTED *** CATALYST: set up the page controller
|
||||
pageViewController.previousController = previousViewController
|
||||
previousViewController?.horizontalPageViewController = pageViewController
|
||||
previousViewController?.currentController = detailViewController.makeStoryController(for: pageIndex)
|
||||
|
||||
return verticalViewController
|
||||
return previousViewController
|
||||
}
|
||||
|
||||
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
|
||||
guard let pageViewController = pageViewController as? HorizontalPageViewController, let detailViewController = pageViewController.detailViewController, let verticalViewController = Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController else {
|
||||
guard let pageViewController = pageViewController as? HorizontalPageViewController, let currentViewController = viewController as? VerticalPageViewController, let detailViewController = pageViewController.detailViewController else {
|
||||
return nil
|
||||
}
|
||||
|
||||
verticalViewController.setViewControllers([detailViewController.nextPage], direction: .forward, animated: false, completion: nil)
|
||||
var pageIndex = (currentViewController.pageIndex ?? -1) + 1
|
||||
|
||||
//TODO: *** TO BE IMPLEMENTED *** CATALYST: set up the page controller
|
||||
if pageIndex == -1 {
|
||||
pageIndex = 0
|
||||
}
|
||||
|
||||
return verticalViewController
|
||||
let nextViewController = detailViewController.pageIndexIsValid(pageIndex) ? Storyboards.shared.controller(withIdentifier: .verticalPages) as? VerticalPageViewController : nil
|
||||
|
||||
pageViewController.nextController = nextViewController
|
||||
nextViewController?.horizontalPageViewController = pageViewController
|
||||
nextViewController?.currentController = detailViewController.makeStoryController(for: pageIndex)
|
||||
|
||||
return nextViewController
|
||||
}
|
||||
|
||||
// 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 {
|
||||
|
||||
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
|
||||
guard let pageViewController = pageViewController as? HorizontalPageViewController, let detailViewController = pageViewController.detailViewController else {
|
||||
return
|
||||
}
|
||||
|
||||
detailViewController.setStoryFromScroll(false)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,4 +12,44 @@ import UIKit
|
|||
class HorizontalPageViewController: UIPageViewController {
|
||||
/// Weak reference to owning detail view controller.
|
||||
weak var detailViewController: DetailViewController?
|
||||
|
||||
/// The currently displayed vertical page view controller. Call `setCurrentController(_:direction:animated:completion:)` instead to animate to the page. Shouldn't be `nil`, but could be if not set up yet.
|
||||
var currentController: VerticalPageViewController? {
|
||||
get {
|
||||
return viewControllers?.first as? VerticalPageViewController
|
||||
}
|
||||
set {
|
||||
if let viewController = newValue {
|
||||
setCurrentController(viewController)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The previous vertical page view controller, if it has been requested, otherwise `nil`.
|
||||
var previousController: VerticalPageViewController?
|
||||
|
||||
/// The next vertical page view controller, if it has been requested, otherwise `nil`.
|
||||
var nextController: VerticalPageViewController?
|
||||
|
||||
/// Clear the previous and next vertical page view controllers.
|
||||
func reset() {
|
||||
previousController = nil
|
||||
nextController = nil
|
||||
}
|
||||
|
||||
/// Sets the currently displayed vertical page view controller.
|
||||
///
|
||||
/// - Parameter controller: The vertical page view controller to display.
|
||||
/// - Parameter direction: The navigation direction. Defaults to `.forward`.
|
||||
/// - Parameter animated: Whether or not to animate it. Defaults to `false`.
|
||||
/// - Parameter completion: A closure to call when the animation completes. Defaults to `nil`.
|
||||
func setCurrentController(_ controller: VerticalPageViewController, direction: UIPageViewController.NavigationDirection = .forward, animated: Bool = false, completion: ((Bool) -> Void)? = nil) {
|
||||
setViewControllers([controller], direction: direction, animated: animated, completion: completion)
|
||||
}
|
||||
|
||||
override func setViewControllers(_ viewControllers: [UIViewController]?, direction: UIPageViewController.NavigationDirection, animated: Bool, completion: ((Bool) -> Void)? = nil) {
|
||||
reset()
|
||||
|
||||
super.setViewControllers(viewControllers, direction: direction, animated: animated, completion: completion)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -603,8 +603,8 @@
|
|||
aboveSubview:self.storyNavigationController.view];
|
||||
|
||||
// reset the storyDetailViewController components
|
||||
self.storyPageControl.currentPage.webView.hidden = YES;
|
||||
self.storyPageControl.nextPage.webView.hidden = YES;
|
||||
// self.storyPageControl.currentStoryController.webView.hidden = YES;
|
||||
// self.storyPageControl.nextPage.webView.hidden = YES;
|
||||
self.storyPageControl.navigationItem.rightBarButtonItems = nil;
|
||||
[self.storyPageControl hidePages];
|
||||
NSInteger unreadCount = appDelegate.unreadCount;
|
||||
|
@ -1182,7 +1182,7 @@
|
|||
} completion:^(BOOL finished) {
|
||||
if (self.keyboardIsShown) {
|
||||
self.storyNavigationController.view.frame = storyNavigationFrame;
|
||||
[self.storyPageControl.currentPage scrolltoComment];
|
||||
[self.storyPageControl.currentStoryController scrolltoComment];
|
||||
[self.storyPageControl resizeScrollView];
|
||||
} else {
|
||||
// remove the shareNavigationController after keyboard slides down
|
||||
|
|
|
@ -1963,10 +1963,9 @@
|
|||
}
|
||||
|
||||
- (void)adjustStoryDetailWebView {
|
||||
// change the web view
|
||||
[storyPageControl.currentPage changeWebViewWidth];
|
||||
[storyPageControl.nextPage changeWebViewWidth];
|
||||
[storyPageControl.previousPage changeWebViewWidth];
|
||||
[storyPageControl updateStoryControllers:^(StoryDetailViewController * _Nonnull storyController) {
|
||||
[storyController changeWebViewWidth];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)calibrateStoryTitles {
|
||||
|
@ -2839,10 +2838,7 @@
|
|||
}
|
||||
|
||||
- (void)finishMarkAsRead:(NSDictionary *)story {
|
||||
if (!storyPageControl.previousPage || !storyPageControl.currentPage || !storyPageControl.nextPage) return;
|
||||
for (StoryDetailViewController *page in @[storyPageControl.previousPage,
|
||||
storyPageControl.currentPage,
|
||||
storyPageControl.nextPage]) {
|
||||
for (StoryDetailViewController *page in storyPageControl.storyControllers) {
|
||||
if ([[page.activeStory objectForKey:@"story_hash"]
|
||||
isEqualToString:[story objectForKey:@"story_hash"]] && page.isRecentlyUnread) {
|
||||
page.isRecentlyUnread = NO;
|
||||
|
@ -2852,10 +2848,7 @@
|
|||
}
|
||||
|
||||
- (void)finishMarkAsUnread:(NSDictionary *)story {
|
||||
if (!storyPageControl.previousPage || !storyPageControl.currentPage || !storyPageControl.nextPage) return;
|
||||
for (StoryDetailViewController *page in @[storyPageControl.previousPage,
|
||||
storyPageControl.currentPage,
|
||||
storyPageControl.nextPage]) {
|
||||
for (StoryDetailViewController *page in storyPageControl.storyControllers) {
|
||||
if ([[page.activeStory objectForKey:@"story_hash"]
|
||||
isEqualToString:[story objectForKey:@"story_hash"]]) {
|
||||
page.isRecentlyUnread = YES;
|
||||
|
@ -3054,6 +3047,8 @@
|
|||
[self showPopoverWithViewController:viewController contentSize:contentSize sourceView:cell sourceRect:cell.bounds];
|
||||
} else if ([sender class] == [UIBarButtonItem class]) {
|
||||
[self showPopoverWithViewController:viewController contentSize:contentSize barButtonItem:sender];
|
||||
} else if ([sender class] == [UIView class]) {
|
||||
[self showPopoverWithViewController:viewController contentSize:contentSize sourceView:sender sourceRect:[sender frame]];
|
||||
} else {
|
||||
CGRect frame = [sender CGRectValue];
|
||||
|
||||
|
@ -3589,7 +3584,7 @@
|
|||
if (self.trainerViewController.isViewLoaded && self.trainerViewController.view.window) {
|
||||
view = self.trainerViewController;
|
||||
} else {
|
||||
view = self.storyPageControl.currentPage;
|
||||
view = self.storyPageControl.currentStoryController;
|
||||
}
|
||||
|
||||
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
|
||||
|
@ -3781,7 +3776,7 @@
|
|||
if (self.trainerViewController.isViewLoaded && self.trainerViewController.view.window) {
|
||||
view = self.trainerViewController;
|
||||
} else {
|
||||
view = self.storyPageControl.currentPage;
|
||||
view = self.storyPageControl.currentStoryController;
|
||||
}
|
||||
if (httpResponse.statusCode == 503) {
|
||||
return [view informError:@"In maintenance mode"];
|
||||
|
|
|
@ -393,7 +393,7 @@
|
|||
[appDelegate.feedDetailViewController redrawUnreadStory];
|
||||
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentPage.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentStoryController.view animated:NO];
|
||||
}
|
||||
|
||||
# pragma mark
|
||||
|
@ -443,10 +443,10 @@
|
|||
|
||||
- (void)requestFailed:(NSError *)error statusCode:(NSInteger)statusCode {
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentPage.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentStoryController.view animated:NO];
|
||||
|
||||
NSLog(@"Error: %@", error);
|
||||
[appDelegate.storyPageControl.currentPage informError:error statusCode:statusCode];
|
||||
[appDelegate.storyPageControl.currentStoryController informError:error statusCode:statusCode];
|
||||
}
|
||||
|
||||
- (void)replaceStory:(NSDictionary *)newStory withReplyId:(NSString *)replyId {
|
||||
|
@ -455,7 +455,7 @@
|
|||
|
||||
// update the current story and the activeFeedStories
|
||||
appDelegate.activeStory = newStoryParsed;
|
||||
[appDelegate.storyPageControl.currentPage setActiveStoryAtIndex:-1];
|
||||
[appDelegate.storyPageControl.currentStoryController setActiveStoryAtIndex:-1];
|
||||
|
||||
NSMutableArray *newActiveFeedStories = [[NSMutableArray alloc] init];
|
||||
|
||||
|
@ -473,7 +473,7 @@
|
|||
appDelegate.storiesCollection.activeFeedStories = [NSArray arrayWithArray:newActiveFeedStories];
|
||||
|
||||
self.commentField.text = nil;
|
||||
[appDelegate.storyPageControl.currentPage refreshComments:replyId];
|
||||
[appDelegate.storyPageControl.currentStoryController refreshComments:replyId];
|
||||
[appDelegate changeActiveFeedDetailRow];
|
||||
}
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ UIActionSheetDelegate, WKNavigationDelegate> {
|
|||
- (NSString *)getReplies:(NSArray *)replies forUserId:(NSString *)commentUserId;
|
||||
- (NSString *)getAvatars:(NSString *)key;
|
||||
- (void)refreshHeader;
|
||||
- (void)refreshSideoptions;
|
||||
- (void)refreshSideOptions;
|
||||
|
||||
- (CGPoint)pointForGesture:(UIGestureRecognizer *)gestureRecognizer;
|
||||
|
||||
|
|
|
@ -59,10 +59,13 @@
|
|||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[self.webView.scrollView removeObserver:self forKeyPath:@"contentOffset"];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
NSString *page = appDelegate.storyPageControl.currentPage == self ? @"currentPage" : appDelegate.storyPageControl.previousPage == self ? @"previousPage" : appDelegate.storyPageControl.nextPage == self ? @"nextPage" : @"unattached page";
|
||||
return [NSString stringWithFormat:@"%@", page];
|
||||
return [NSString stringWithFormat:@"%@: page %@, '%@'", [super description], @(pageIndex), activeStory[@"story_title"]];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
|
@ -544,7 +547,7 @@
|
|||
"<script src=\"storyDetailView.js\"></script>"
|
||||
"<script src=\"fastTouch.js\"></script>"];
|
||||
|
||||
sharingHtmlString = [self getSideoptions];
|
||||
sharingHtmlString = [self getSideOptions];
|
||||
|
||||
NSString *storyHeader = [self getHeader];
|
||||
|
||||
|
@ -685,6 +688,7 @@
|
|||
self.activeStoryId = nil;
|
||||
self.webView.hidden = YES;
|
||||
self.noStoryMessage.hidden = NO;
|
||||
[self.activityIndicator stopAnimating];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
@ -839,11 +843,11 @@
|
|||
return storyHeader;
|
||||
}
|
||||
|
||||
- (NSString *)getSideoptions {
|
||||
- (NSString *)getSideOptions {
|
||||
BOOL isSaved = [[self.activeStory objectForKey:@"starred"] boolValue];
|
||||
BOOL isShared = [[self.activeStory objectForKey:@"shared"] boolValue];
|
||||
|
||||
NSString *sideoptions = [NSString stringWithFormat:@
|
||||
NSString *sideOptions = [NSString stringWithFormat:@
|
||||
"<div class='NB-sideoptions'>"
|
||||
"<div class='NB-share-header'></div>"
|
||||
"<div class='NB-share-wrapper'><div class='NB-share-inner-wrapper'>"
|
||||
|
@ -869,7 +873,7 @@
|
|||
isSaved ? @"Saved" : @"Save"
|
||||
];
|
||||
|
||||
return sideoptions;
|
||||
return sideOptions;
|
||||
}
|
||||
|
||||
- (NSString *)getAvatars:(NSString *)key {
|
||||
|
@ -1366,7 +1370,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
if (appDelegate.storyPageControl.currentPage != self) return;
|
||||
if (appDelegate.storyPageControl.currentStoryController != self) return;
|
||||
|
||||
int webpageHeight = self.webView.scrollView.contentSize.height;
|
||||
int viewportHeight = self.view.frame.size.height;
|
||||
|
@ -1882,6 +1886,8 @@
|
|||
}
|
||||
|
||||
- (void)updateStoryTheme {
|
||||
self.view.backgroundColor = UIColorFromLightDarkRGB(0x707070, 0x404040);
|
||||
|
||||
NSString *jsString = [NSString stringWithFormat:@"document.getElementById('NB-theme-style').href='storyDetailView%@.css';",
|
||||
[ThemeManager themeManager].themeCSSSuffix];
|
||||
|
||||
|
@ -1963,7 +1969,7 @@
|
|||
appDelegate.storiesCollection.activeFeedStories = [NSArray arrayWithArray:newActiveFeedStories];
|
||||
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentPage.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentStoryController.view animated:NO];
|
||||
[self refreshComments:@"like"];
|
||||
}
|
||||
|
||||
|
@ -1972,7 +1978,7 @@
|
|||
NSLog(@"Error in story detail: %@", error);
|
||||
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentPage.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentStoryController.view animated:NO];
|
||||
|
||||
[self informError:error statusCode:statusCode];
|
||||
}
|
||||
|
@ -2134,7 +2140,7 @@
|
|||
}
|
||||
|
||||
- (CGPoint)pointForEvent:(NSNotification*)notification {
|
||||
if (self != appDelegate.storyPageControl.currentPage) return CGPointZero;
|
||||
if (self != appDelegate.storyPageControl.currentStoryController) return CGPointZero;
|
||||
if (!self.view.window) return CGPointZero;
|
||||
|
||||
CGPoint pt;
|
||||
|
@ -2160,10 +2166,10 @@
|
|||
}
|
||||
|
||||
- (CGPoint)pointForGesture:(UIGestureRecognizer *)gestureRecognizer {
|
||||
if (self != appDelegate.storyPageControl.currentPage) return CGPointZero;
|
||||
if (self != appDelegate.storyPageControl.currentStoryController) return CGPointZero;
|
||||
if (!self.view.window) return CGPointZero;
|
||||
|
||||
CGPoint pt = [gestureRecognizer locationInView:appDelegate.storyPageControl.currentPage.webView];
|
||||
CGPoint pt = [gestureRecognizer locationInView:appDelegate.storyPageControl.currentStoryController.webView];
|
||||
|
||||
// convert point from view to HTML coordinate system
|
||||
// CGPoint offset = [self.webView scrollOffset];
|
||||
|
@ -2271,7 +2277,7 @@
|
|||
initWithFormat:@"slideToComment('%@', true);", currentUserId];
|
||||
[self.webView evaluateJavaScript:jsFlashString completionHandler:^(id result, NSError * _Nullable error) {
|
||||
[self flashCheckmarkHud:shareType];
|
||||
[self refreshSideoptions];
|
||||
[self refreshSideOptions];
|
||||
}];
|
||||
} else if ([replyId isEqualToString:@"like"]) {
|
||||
|
||||
|
@ -2280,7 +2286,7 @@
|
|||
initWithFormat:@"slideToComment('%@', true);", replyId];
|
||||
[self.webView evaluateJavaScript:jsFlashString completionHandler:^(id result, NSError * _Nullable error) {
|
||||
[self flashCheckmarkHud:shareType];
|
||||
[self refreshSideoptions];
|
||||
[self refreshSideOptions];
|
||||
}];
|
||||
}
|
||||
});
|
||||
|
@ -2290,7 +2296,7 @@
|
|||
|
||||
- (void)flashCheckmarkHud:(NSString *)messageType {
|
||||
[MBProgressHUD hideHUDForView:self.webView animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentPage.view animated:NO];
|
||||
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.currentStoryController.view animated:NO];
|
||||
self.storyHUD = [MBProgressHUD showHUDAddedTo:self.webView animated:YES];
|
||||
self.storyHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
|
||||
self.storyHUD.mode = MBProgressHUDModeCustomView;
|
||||
|
@ -2448,11 +2454,11 @@
|
|||
}];
|
||||
}
|
||||
|
||||
- (void)refreshSideoptions {
|
||||
NSString *sideoptionsString = [[[self getSideoptions] stringByReplacingOccurrencesOfString:@"\'" withString:@"\\'"]
|
||||
- (void)refreshSideOptions {
|
||||
NSString *sideOptionsString = [[[self getSideOptions] stringByReplacingOccurrencesOfString:@"\'" withString:@"\\'"]
|
||||
stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
|
||||
NSString *jsString = [NSString stringWithFormat:@"document.getElementById('NB-sideoptions-container').innerHTML = '%@';",
|
||||
sideoptionsString];
|
||||
sideOptionsString];
|
||||
|
||||
[self.webView evaluateJavaScript:jsString completionHandler:^(id result, NSError *error) {
|
||||
[self.webView evaluateJavaScript:@"attachFastClick();" completionHandler:nil];
|
||||
|
@ -2494,7 +2500,7 @@
|
|||
if (!self.activeStoryId || !self.activeStory) return;
|
||||
self.inTextView = YES;
|
||||
// NSLog(@"Fetching Text: %@", [self.activeStory objectForKey:@"story_title"]);
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentPage.activeStory) {
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentStoryController.activeStory) {
|
||||
[self.appDelegate.storyPageControl showFetchingTextNotifier];
|
||||
}
|
||||
NSString *storyId = [self.activeStory objectForKey:@"id"];
|
||||
|
@ -2511,7 +2517,7 @@
|
|||
- (void)failedFetchText {
|
||||
[self.appDelegate.storyPageControl hideNotifier];
|
||||
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentPage.activeStory) {
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentStoryController.activeStory) {
|
||||
[self informError:@"Could not fetch text"];
|
||||
}
|
||||
self.inTextView = NO;
|
||||
|
@ -2548,7 +2554,7 @@
|
|||
if (!self.activeStoryId || !self.activeStory) return;
|
||||
self.inTextView = YES;
|
||||
// NSLog(@"Fetching Changes: %@", [self.activeStory objectForKey:@"story_title"]);
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentPage.activeStory) {
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentStoryController.activeStory) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self.appDelegate.storyPageControl showFetchingTextNotifier];
|
||||
});
|
||||
|
@ -2570,7 +2576,7 @@
|
|||
- (void)failedFetchStoryChanges:(NSError *)error {
|
||||
[self.appDelegate.storyPageControl hideNotifier];
|
||||
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentPage.activeStory) {
|
||||
if (self.activeStory == appDelegate.storyPageControl.currentStoryController.activeStory) {
|
||||
[self informError:@"Could not fetch changes"];
|
||||
}
|
||||
self.inTextView = NO;
|
||||
|
|
|
@ -11,7 +11,12 @@ import UIKit
|
|||
/// An individual story.
|
||||
class StoryDetailViewController: StoryDetailObjCViewController {
|
||||
/// Convenience initializer to load a new instance of this class from the XIB.
|
||||
convenience init() {
|
||||
///
|
||||
/// - Parameter pageIndex: The page index of the story.
|
||||
convenience init(pageIndex: Int) {
|
||||
self.init(nibName: "StoryDetailViewController", bundle: nil)
|
||||
|
||||
self.appDelegate = NewsBlurAppDelegate.shared()
|
||||
self.pageIndex = pageIndex
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,35 +14,45 @@ class VerticalPageDelegate: NSObject {
|
|||
|
||||
extension VerticalPageDelegate: UIPageViewControllerDataSource {
|
||||
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
|
||||
guard let pageViewController = pageViewController as? VerticalPageViewController, let detailViewController = pageViewController.detailViewController else {
|
||||
guard let pageViewController = pageViewController as? VerticalPageViewController, let currentViewController = viewController as? StoryDetailViewController, let detailViewController = pageViewController.detailViewController else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return detailViewController.previousPage
|
||||
let pageIndex = currentViewController.pageIndex - 1
|
||||
let storyController = detailViewController.pageIndexIsValid(pageIndex) ? detailViewController.makeStoryController(for: pageIndex) : nil
|
||||
pageViewController.previousController = storyController
|
||||
|
||||
return storyController
|
||||
}
|
||||
|
||||
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
|
||||
guard let pageViewController = pageViewController as? VerticalPageViewController, let detailViewController = pageViewController.detailViewController else {
|
||||
guard let pageViewController = pageViewController as? VerticalPageViewController, let currentViewController = viewController as? StoryDetailViewController, let detailViewController = pageViewController.detailViewController else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return detailViewController.nextPage
|
||||
var pageIndex = currentViewController.pageIndex + 1
|
||||
|
||||
if pageIndex == -1 {
|
||||
pageIndex = 0
|
||||
}
|
||||
|
||||
let storyController = detailViewController.pageIndexIsValid(pageIndex) ? detailViewController.makeStoryController(for: pageIndex) : nil
|
||||
|
||||
pageViewController.nextController = storyController
|
||||
|
||||
return storyController
|
||||
}
|
||||
|
||||
// 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 {
|
||||
|
||||
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
|
||||
guard let pageViewController = pageViewController as? VerticalPageViewController, let detailViewController = pageViewController.detailViewController, let horizontalPageViewController = detailViewController.horizontalPageViewController else {
|
||||
return
|
||||
}
|
||||
|
||||
horizontalPageViewController.setCurrentController(pageViewController)
|
||||
horizontalPageViewController.reset()
|
||||
|
||||
detailViewController.setStoryFromScroll(false)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,4 +17,53 @@ class VerticalPageViewController: UIPageViewController {
|
|||
weak var detailViewController: DetailViewController? {
|
||||
return horizontalPageViewController?.detailViewController
|
||||
}
|
||||
|
||||
/// Returns the story page index of the currently displayed page.
|
||||
var pageIndex: Int? {
|
||||
guard let current = currentController else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return current.pageIndex
|
||||
}
|
||||
|
||||
/// The currently displayed story view controller. Call `setCurrentController(_:direction:animated:completion:)` instead to animate to the page. Shouldn't be `nil`, but could be if not set up yet.
|
||||
var currentController: StoryDetailViewController? {
|
||||
get {
|
||||
return viewControllers?.first as? StoryDetailViewController
|
||||
}
|
||||
set {
|
||||
if let viewController = newValue {
|
||||
setCurrentController(viewController)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The previous story view controller, if it has been requested, otherwise `nil`.
|
||||
var previousController: StoryDetailViewController?
|
||||
|
||||
/// The next story view controller, if it has been requested, otherwise `nil`.
|
||||
var nextController: StoryDetailViewController?
|
||||
|
||||
/// Clear the previous and next story view controllers.
|
||||
func reset() {
|
||||
previousController = nil
|
||||
nextController = nil
|
||||
}
|
||||
|
||||
/// Sets the currently displayed story view controller.
|
||||
///
|
||||
/// - Parameter controller: The story view controller to display.
|
||||
/// - Parameter direction: The navigation direction. Defaults to `.forward`.
|
||||
/// - Parameter animated: Whether or not to animate it. Defaults to `false`.
|
||||
/// - Parameter completion: A closure to call when the animation completes. Defaults to `nil`.
|
||||
func setCurrentController(_ controller: StoryDetailViewController, direction: UIPageViewController.NavigationDirection = .forward, animated: Bool = false, completion: ((Bool) -> Void)? = nil) {
|
||||
setViewControllers([controller], direction: direction, animated: animated, completion: completion)
|
||||
}
|
||||
|
||||
override func setViewControllers(_ viewControllers: [UIViewController]?, direction: UIPageViewController.NavigationDirection, animated: Bool, completion: ((Bool) -> Void)? = nil) {
|
||||
reset()
|
||||
|
||||
super.setViewControllers(viewControllers, direction: direction, animated: animated, completion: completion)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
010EDEFC1B238722003B79DE /* 1Password.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 010EDEFB1B238722003B79DE /* 1Password.xcassets */; };
|
||||
17042DB92391D68A001BCD32 /* WidgetStory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17042DB82391D68A001BCD32 /* WidgetStory.swift */; };
|
||||
17042DBB23922A4D001BCD32 /* WidgetLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17042DBA23922A4D001BCD32 /* WidgetLoader.swift */; };
|
||||
1704EEE4254CB1AB008A3906 /* logo_emboss.png in Resources */ = {isa = PBXBuildFile; fileRef = 1704EEE3254CB1AB008A3906 /* logo_emboss.png */; };
|
||||
170E3CCD24F8A3A2009CE819 /* FeedsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CCC24F8A3A2009CE819 /* FeedsViewController.swift */; };
|
||||
170E3CCF24F8A5D8009CE819 /* SplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CCE24F8A5D8009CE819 /* SplitViewController.swift */; };
|
||||
170E3CD124F8A664009CE819 /* SplitViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 170E3CD024F8A664009CE819 /* SplitViewDelegate.swift */; };
|
||||
|
@ -675,6 +676,7 @@
|
|||
010EDEFB1B238722003B79DE /* 1Password.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = 1Password.xcassets; path = "Other Sources/OnePasswordExtension/1Password.xcassets"; sourceTree = "<group>"; };
|
||||
17042DB82391D68A001BCD32 /* WidgetStory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetStory.swift; sourceTree = "<group>"; };
|
||||
17042DBA23922A4D001BCD32 /* WidgetLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetLoader.swift; sourceTree = "<group>"; };
|
||||
1704EEE3254CB1AB008A3906 /* logo_emboss.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = logo_emboss.png; path = Resources/logo_emboss.png; sourceTree = SOURCE_ROOT; };
|
||||
170E3CCC24F8A3A2009CE819 /* FeedsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedsViewController.swift; sourceTree = "<group>"; };
|
||||
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>"; };
|
||||
|
@ -1950,6 +1952,7 @@
|
|||
17876BA21C99137B0055DD15 /* accessory_disclosure.png */,
|
||||
17876BA31C99137B0055DD15 /* accessory_disclosure@2x.png */,
|
||||
FFB9BE3F17F4B65B00FE0A36 /* logos */,
|
||||
1704EEE3254CB1AB008A3906 /* logo_emboss.png */,
|
||||
FFE816AC17E29D71008AF4B0 /* big_world_white.png */,
|
||||
FFE816AA17E280BD008AF4B0 /* ftux_tree.png */,
|
||||
FF855B541794A53A0098D48A /* checkmark.png */,
|
||||
|
@ -3141,6 +3144,7 @@
|
|||
FF85BF6316D5A5A8002D334D /* nav_icn_add.png in Resources */,
|
||||
FF85BF7116D6A90D002D334D /* ak-icon-global.png in Resources */,
|
||||
FFC486AD19CA410000F4758F /* logo_100.png in Resources */,
|
||||
1704EEE4254CB1AB008A3906 /* logo_emboss.png in Resources */,
|
||||
FF6DD31E1AEDF9F300F1F53A /* menu_icn_rename.png in Resources */,
|
||||
FF85BF7416D6A972002D334D /* ak-icon-allstories.png in Resources */,
|
||||
FF85BF7516D6A972002D334D /* ak-icon-blurblogs.png in Resources */,
|
||||
|
@ -3671,7 +3675,11 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
INFOPLIST_FILE = "Share Extension/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 10.1.1;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.newsblur.NewsBlur.Share-Extension";
|
||||
|
@ -3715,7 +3723,11 @@
|
|||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
INFOPLIST_FILE = "Share Extension/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 10.1.1;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.newsblur.NewsBlur.Share-Extension";
|
||||
|
@ -3762,7 +3774,11 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
INFOPLIST_FILE = "Widget Extension/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 10.1.1;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
|
@ -3804,7 +3820,11 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
INFOPLIST_FILE = "Widget Extension/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 10.1.1;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
|
@ -4046,7 +4066,11 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
INFOPLIST_FILE = "Story Notification Service Extension/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.1;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 10.1.1;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.newsblur.NewsBlur.Story-Notification-Service-Extension";
|
||||
|
@ -4081,7 +4105,11 @@
|
|||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
INFOPLIST_FILE = "Story Notification Service Extension/Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 10.1;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 10.1.1;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.newsblur.NewsBlur.Story-Notification-Service-Extension";
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="17506" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
|
||||
<device id="ipad9_7" orientation="portrait" layout="fullscreen" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17504.1"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
|
@ -23,7 +23,7 @@
|
|||
<rect key="frame" x="224" y="296" width="320" height="235"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" fixedFrame="YES" image="big_world_white.png" translatesAutoresizingMaskIntoConstraints="NO" id="113">
|
||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" fixedFrame="YES" image="logo_emboss.png" translatesAutoresizingMaskIntoConstraints="NO" id="113">
|
||||
<rect key="frame" x="40" y="20" width="240" height="128"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
</imageView>
|
||||
|
@ -33,8 +33,7 @@
|
|||
<fontDescription key="fontDescription" type="boldSystem" pointSize="16"/>
|
||||
<color key="textColor" red="0.66666668653488159" green="0.66666668653488159" blue="0.66666668653488159" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<color key="shadowColor" red="0.3333333432674408" green="0.3333333432674408" blue="0.3333333432674408" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<size key="shadowOffset" width="0.0" height="1"/>
|
||||
<size key="shadowOffset" width="0.0" height="0.0"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
|
@ -44,13 +43,16 @@
|
|||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
</activityIndicatorView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
|
||||
<color key="backgroundColor" systemColor="scrollViewTexturedBackgroundColor"/>
|
||||
<nil key="simulatedStatusBarMetrics"/>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<point key="canvasLocation" x="138.28125" y="153.515625"/>
|
||||
</view>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="big_world_white.png" width="30.719999313354492" height="30.719999313354492"/>
|
||||
<image name="logo_emboss.png" width="256" height="256"/>
|
||||
<systemColor name="scrollViewTexturedBackgroundColor">
|
||||
<color red="0.43529411764705878" green="0.44313725490196082" blue="0.47450980392156861" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</systemColor>
|
||||
</resources>
|
||||
</document>
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17503.1" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="6pv-7g-17r">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="6pv-7g-17r">
|
||||
<device id="ipad11_0rounded" orientation="landscape" layout="fullscreen" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17502"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17504.1"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
|
@ -14,7 +14,7 @@
|
|||
<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" height="834"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="818.5" height="834"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4vK-W4-ayS">
|
||||
|
|
BIN
clients/ios/Resources/logo_emboss.png
Normal file
BIN
clients/ios/Resources/logo_emboss.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
Loading…
Add table
Reference in a new issue