2012-11-05 15:12:42 -08:00
//
// StoryPageControl . m
// NewsBlur
//
// Created by Samuel Clay on 11 / 2 / 12.
// Copyright ( c ) 2012 NewsBlur . All rights reserved .
//
# import "StoryPageControl.h"
# import "StoryDetailViewController.h"
2012-11-05 17:16:10 -08:00
# import "NewsBlurAppDelegate.h"
# import "NewsBlurViewController.h"
# import "FeedDetailViewController.h"
# import "FontSettingsViewController.h"
# import "UserProfileViewController.h"
# import "ShareViewController.h"
# import "ASIHTTPRequest.h"
# import "ASIFormDataRequest.h"
# import "Base64.h"
# import "Utilities.h"
# import "NSString+HTML.h"
# import "NBContainerViewController.h"
# import "DataUtilities.h"
2015-09-16 16:53:07 -07:00
# import "SBJson4.h"
2013-02-27 18:04:03 -08:00
# import "UIBarButtonItem+Image.h"
2013-04-10 21:06:17 -07:00
# import "THCircularProgressView.h"
2013-06-16 08:15:40 -07:00
# import "FMDatabase.h"
2014-02-12 20:09:37 -08:00
# import "StoriesCollection.h"
2012-11-05 15:12:42 -08:00
@ implementation StoryPageControl
@ synthesize appDelegate ;
2012-11-14 17:31:52 -08:00
@ synthesize currentPage , nextPage , previousPage ;
2013-04-10 21:06:17 -07:00
@ synthesize circularProgressView ;
2013-02-27 18:04:03 -08:00
@ synthesize separatorBarButton ;
@ synthesize spacerBarButton , spacer2BarButton , spacer3BarButton ;
2012-11-05 17:16:10 -08:00
@ synthesize buttonPrevious ;
@ synthesize buttonNext ;
@ synthesize buttonAction ;
2013-05-29 13:36:39 -07:00
@ synthesize buttonText ;
2013-07-19 18:19:30 -07:00
@ synthesize buttonSend ;
2012-11-05 17:16:10 -08:00
@ synthesize fontSettingsButton ;
@ synthesize originalStoryButton ;
@ synthesize subscribeButton ;
@ synthesize buttonBack ;
2013-09-26 19:26:10 -07:00
@ synthesize bottomSize ;
2015-09-23 13:02:25 -07:00
@ synthesize bottomSizeHeightConstraint ;
2012-11-05 17:16:10 -08:00
@ synthesize popoverController ;
@ synthesize loadingIndicator ;
2012-11-07 17:54:16 -08:00
@ synthesize inTouchMove ;
2012-11-08 18:30:45 -08:00
@ synthesize isDraggingScrollview ;
2012-12-13 16:41:52 -08:00
@ synthesize waitingForNextUnreadFromServer ;
2012-11-09 14:13:44 -08:00
@ synthesize storyHUD ;
2012-11-14 17:31:52 -08:00
@ synthesize scrollingToPage ;
2013-03-06 14:29:40 -08:00
@ synthesize traverseView ;
2014-01-30 20:28:08 -08:00
@ synthesize isAnimatedIntoPlace ;
2013-04-26 13:51:03 -07:00
@ synthesize progressView , progressViewContainer ;
2013-03-07 10:55:23 -05:00
@ synthesize traversePinned , traverseFloating ;
2012-11-05 15:12:42 -08:00
- ( id ) initWithNibName : ( NSString * ) nibNameOrNil bundle : ( NSBundle * ) nibBundleOrNil {
self = [ super initWithNibName : nibNameOrNil bundle : nibBundleOrNil ] ;
if ( self ) {
// Custom initialization
}
return self ;
}
2012-11-05 18:23:45 -08:00
- ( void ) viewDidLoad {
2014-09-18 11:25:51 -07:00
[ super viewDidLoad ] ;
2013-10-03 13:54:15 -07:00
currentPage = [ [ StoryDetailViewController alloc ]
initWithNibName : @ "StoryDetailViewController"
bundle : nil ] ;
nextPage = [ [ StoryDetailViewController alloc ]
initWithNibName : @ "StoryDetailViewController"
bundle : nil ] ;
previousPage = [ [ StoryDetailViewController alloc ]
initWithNibName : @ "StoryDetailViewController"
bundle : nil ] ;
2012-11-14 17:31:52 -08:00
2013-06-10 00:29:03 -07:00
currentPage . appDelegate = appDelegate ;
nextPage . appDelegate = appDelegate ;
previousPage . appDelegate = appDelegate ;
2012-11-09 09:31:26 -08:00
currentPage . view . frame = self . scrollView . frame ;
nextPage . view . frame = self . scrollView . frame ;
2012-11-14 17:31:52 -08:00
previousPage . view . frame = self . scrollView . frame ;
2015-03-12 19:43:39 -07:00
NSLog ( @ "Scroll view content inset: %@" , NSStringFromCGRect ( self . scrollView . bounds ) ) ;
NSLog ( @ "Scroll view frame pre: %@" , NSStringFromCGRect ( self . scrollView . frame ) ) ;
2012-11-05 15:12:42 -08:00
[ self . scrollView addSubview : currentPage . view ] ;
[ self . scrollView addSubview : nextPage . view ] ;
2012-11-14 17:31:52 -08:00
[ self . scrollView addSubview : previousPage . view ] ;
2014-12-01 17:22:40 -08:00
[ self addChildViewController : currentPage ] ;
[ self addChildViewController : nextPage ] ;
[ self addChildViewController : previousPage ] ;
2012-11-05 15:12:42 -08:00
[ self . scrollView setPagingEnabled : YES ] ;
[ self . scrollView setScrollEnabled : YES ] ;
[ self . scrollView setShowsHorizontalScrollIndicator : NO ] ;
[ self . scrollView setShowsVerticalScrollIndicator : NO ] ;
2015-03-12 19:43:39 -07:00
NSLog ( @ "Scroll view frame post: %@" , NSStringFromCGRect ( self . scrollView . frame ) ) ;
NSLog ( @ "Scroll view parent: %@" , NSStringFromCGRect ( currentPage . view . frame ) ) ;
[ self . scrollView sizeToFit ] ;
NSLog ( @ "Scroll view frame post 2: %@" , NSStringFromCGRect ( self . scrollView . frame ) ) ;
2012-11-05 17:16:10 -08:00
2014-11-04 12:15:49 -08:00
popoverClass = [ WYPopoverController class ] ;
2012-11-05 17:16:10 -08:00
2013-05-30 16:31:57 -07:00
// adding HUD for progress bar
2013-04-12 13:06:47 -07:00
CGFloat radius = 8 ;
2013-04-10 21:06:17 -07:00
circularProgressView = [ [ THCircularProgressView alloc ]
2013-05-30 16:31:57 -07:00
initWithCenter : CGPointMake ( self . buttonNext . frame . origin . x + 2 * radius ,
2013-04-10 21:06:17 -07:00
self . traverseView . frame . size . height / 2 )
radius : radius
lineWidth : radius / 4.0 f
progressMode : THProgressModeFill
2013-04-12 13:06:47 -07:00
progressColor : [ UIColor colorWithRed : 0.612 f green : 0.62 f blue : 0.596 f alpha : 0.4 f ]
2013-04-10 21:06:17 -07:00
progressBackgroundMode : THProgressBackgroundModeCircumference
2013-07-19 17:53:52 -07:00
progressBackgroundColor : [ UIColor colorWithRed : 0.312 f green : 0.32 f blue : 0.296 f alpha : .04 f ]
2013-04-10 21:06:17 -07:00
percentage : 20 ] ;
2013-05-30 16:31:57 -07:00
circularProgressView . autoresizingMask = UIViewAutoresizingFlexibleLeftMargin ;
2013-04-10 21:06:17 -07:00
[ self . traverseView addSubview : circularProgressView ] ;
2013-10-03 13:54:15 -07:00
UIView * tapIndicator = [ [ UIView alloc ]
initWithFrame : CGRectMake ( circularProgressView . frame . origin . x -
circularProgressView . frame . size . width / 2 ,
circularProgressView . frame . origin . y -
circularProgressView . frame . size . height / 2 ,
circularProgressView . frame . size . width * 2 ,
circularProgressView . frame . size . height * 2 ) ] ;
UITapGestureRecognizer * tap = [ [ UITapGestureRecognizer alloc ]
initWithTarget : self
action : @ selector ( tapProgressBar : ) ] ;
2013-05-28 18:07:19 -07:00
[ tapIndicator addGestureRecognizer : tap ] ;
2013-05-30 16:31:57 -07:00
tapIndicator . autoresizingMask = UIViewAutoresizingFlexibleLeftMargin ;
2013-05-28 18:07:19 -07:00
[ self . traverseView insertSubview : tapIndicator aboveSubview : circularProgressView ] ;
2013-04-23 11:52:34 -07:00
self . loadingIndicator . frame = self . circularProgressView . frame ;
2013-04-10 21:06:17 -07:00
2013-02-27 18:04:03 -08:00
spacerBarButton = [ [ UIBarButtonItem alloc ]
2013-10-03 13:54:15 -07:00
initWithBarButtonSystemItem : UIBarButtonSystemItemFixedSpace
target : nil action : nil ] ;
2013-02-27 18:04:03 -08:00
spacerBarButton . width = -12 ;
spacer2BarButton = [ [ UIBarButtonItem alloc ]
2013-10-03 13:54:15 -07:00
initWithBarButtonSystemItem : UIBarButtonSystemItemFixedSpace
target : nil action : nil ] ;
spacer2BarButton . width = -6 ;
2013-02-27 18:04:03 -08:00
spacer3BarButton = [ [ UIBarButtonItem alloc ]
2013-10-03 13:54:15 -07:00
initWithBarButtonSystemItem : UIBarButtonSystemItemFixedSpace
target : nil action : nil ] ;
spacer3BarButton . width = -6 ;
2012-11-05 17:16:10 -08:00
2013-02-27 18:04:03 -08:00
UIImage * separatorImage = [ UIImage imageNamed : @ "bar-separator.png" ] ;
2013-10-03 13:54:15 -07:00
separatorBarButton = [ UIBarButtonItem barItemWithImage : separatorImage
target : nil
action : nil ] ;
2013-02-27 18:04:03 -08:00
[ separatorBarButton setEnabled : NO ] ;
2012-11-05 17:16:10 -08:00
2013-02-27 18:04:03 -08:00
UIImage * settingsImage = [ UIImage imageNamed : @ "nav_icn_settings.png" ] ;
2013-10-03 13:54:15 -07:00
fontSettingsButton = [ UIBarButtonItem barItemWithImage : settingsImage
target : self
action : @ selector ( toggleFontSize : ) ] ;
2012-11-05 17:16:10 -08:00
2013-02-27 18:04:03 -08:00
UIImage * markreadImage = [ UIImage imageNamed : @ "original_button.png" ] ;
2013-10-03 13:54:15 -07:00
originalStoryButton = [ UIBarButtonItem barItemWithImage : markreadImage
target : self
action : @ selector ( showOriginalSubview : ) ] ;
2012-11-05 17:16:10 -08:00
UIBarButtonItem * subscribeBtn = [ [ UIBarButtonItem alloc ]
initWithTitle : @ "Follow User"
style : UIBarButtonSystemItemAction
target : self
action : @ selector ( subscribeToBlurblog )
] ;
self . subscribeButton = subscribeBtn ;
// back button
UIBarButtonItem * backButton = [ [ UIBarButtonItem alloc ]
2013-10-03 13:54:15 -07:00
initWithTitle : @ "All Sites"
2015-09-16 16:53:07 -07:00
style : UIBarButtonItemStylePlain
2013-10-03 13:54:15 -07:00
target : self
action : @ selector ( transitionFromFeedDetail ) ] ;
2012-11-05 17:16:10 -08:00
self . buttonBack = backButton ;
2013-03-04 18:21:10 -08:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPhone ) {
2013-10-11 17:46:09 -07:00
self . navigationItem . rightBarButtonItems = [ NSArray arrayWithObjects :
originalStoryButton ,
separatorBarButton ,
fontSettingsButton , nil ] ;
2013-03-04 18:21:10 -08:00
}
2012-11-08 18:30:45 -08:00
[ self . scrollView addObserver : self forKeyPath : @ "contentOffset"
options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context : nil ] ;
2013-03-04 17:15:50 -08:00
_orientation = [ UIApplication sharedApplication ] . statusBarOrientation ;
2012-11-05 15:12:42 -08:00
}
- ( void ) viewWillAppear : ( BOOL ) animated {
2014-09-18 11:25:51 -07:00
[ super viewWillAppear : animated ] ;
2012-11-08 17:39:32 -08:00
[ self setNextPreviousButtons ] ;
2013-12-11 18:06:22 -08:00
[ self setTextButton ] ;
2015-09-23 13:02:25 -07:00
2013-12-06 16:19:27 -08:00
NSUserDefaults * userPreferences = [ NSUserDefaults standardUserDefaults ] ;
BOOL swipeEnabled = [ [ userPreferences stringForKey : @ "story_detail_swipe_left_edge" ]
isEqualToString : @ "pop_to_story_list" ] ;;
self . navigationController . interactivePopGestureRecognizer . enabled = swipeEnabled ;
2013-09-26 19:26:10 -07:00
2012-11-13 13:07:36 -08:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPhone ) {
2014-02-12 20:09:37 -08:00
if ( ! appDelegate . storiesCollection . isSocialView ) {
2012-11-13 13:07:36 -08:00
UIImage * titleImage ;
2014-02-12 20:09:37 -08:00
if ( appDelegate . storiesCollection . isSocialRiverView &&
[ appDelegate . storiesCollection . activeFolder isEqualToString : @ "river_global" ] ) {
2013-02-21 12:19:15 -08:00
titleImage = [ UIImage imageNamed : @ "ak-icon-global.png" ] ;
2014-02-12 20:09:37 -08:00
} else if ( appDelegate . storiesCollection . isSocialRiverView &&
[ appDelegate . storiesCollection . activeFolder isEqualToString : @ "river_blurblogs" ] ) {
2013-02-21 12:19:15 -08:00
titleImage = [ UIImage imageNamed : @ "ak-icon-blurblogs.png" ] ;
2014-02-12 20:09:37 -08:00
} else if ( appDelegate . storiesCollection . isRiverView &&
[ appDelegate . storiesCollection . activeFolder isEqualToString : @ "everything" ] ) {
2013-02-21 12:19:15 -08:00
titleImage = [ UIImage imageNamed : @ "ak-icon-allstories.png" ] ;
2014-05-20 15:29:16 -07:00
} else if ( appDelegate . storiesCollection . isSavedView &&
appDelegate . storiesCollection . activeSavedStoryTag ) {
titleImage = [ UIImage imageNamed : @ "tag.png" ] ;
2014-10-22 16:39:37 -07:00
} else if ( [ appDelegate . storiesCollection . activeFolder isEqualToString : @ "read_stories" ] ) {
2014-10-22 17:03:48 -07:00
titleImage = [ UIImage imageNamed : @ "g_icn_folder_read.png" ] ;
2014-05-20 15:29:16 -07:00
} else if ( [ appDelegate . storiesCollection . activeFolder isEqualToString : @ "saved_stories" ] ) {
2013-03-07 10:55:23 -05:00
titleImage = [ UIImage imageNamed : @ "clock.png" ] ;
2014-02-12 20:09:37 -08:00
} else if ( appDelegate . storiesCollection . isRiverView ) {
2013-02-21 14:44:34 -08:00
titleImage = [ UIImage imageNamed : @ "g_icn_folder.png" ] ;
2012-11-13 13:07:36 -08:00
} else {
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" ,
[ appDelegate . activeStory objectForKey : @ "story_feed_id" ] ] ;
2014-02-24 18:56:51 -08:00
titleImage = [ appDelegate getFavicon : feedIdStr ] ;
2012-11-13 13:07:36 -08:00
}
UIImageView * titleImageView = [ [ UIImageView alloc ] initWithImage : titleImage ] ;
2014-02-12 20:09:37 -08:00
if ( appDelegate . storiesCollection . isRiverView ) {
2012-11-13 13:07:36 -08:00
titleImageView . frame = CGRectMake ( 0.0 , 2.0 , 22.0 , 22.0 ) ;
} else {
titleImageView . frame = CGRectMake ( 0.0 , 2.0 , 16.0 , 16.0 ) ;
}
titleImageView . hidden = YES ;
titleImageView . contentMode = UIViewContentModeScaleAspectFit ;
2014-01-07 18:26:17 -08:00
if ( ! self . navigationItem . titleView ) {
self . navigationItem . titleView = titleImageView ;
}
2012-11-13 13:07:36 -08:00
titleImageView . hidden = NO ;
} else {
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" ,
2014-02-12 20:09:37 -08:00
[ appDelegate . storiesCollection . activeFeed objectForKey : @ "id" ] ] ;
2014-02-24 18:56:51 -08:00
UIImage * titleImage = [ appDelegate getFavicon : feedIdStr ] ;
2012-11-13 13:07:36 -08:00
titleImage = [ Utilities roundCorneredImage : titleImage radius : 6 ] ;
UIImageView * imageView = [ [ UIImageView alloc ] initWithFrame : CGRectZero ] ;
imageView . frame = CGRectMake ( 0.0 , 0.0 , 28.0 , 28.0 ) ;
imageView . contentMode = UIViewContentModeScaleAspectFit ;
[ imageView setImage : titleImage ] ;
self . navigationItem . titleView = imageView ;
}
}
2012-12-18 17:29:23 -08:00
previousPage . view . hidden = YES ;
2013-09-05 16:34:39 -07:00
self . traverseView . alpha = 1 ;
2014-01-30 20:28:08 -08:00
self . isAnimatedIntoPlace = NO ;
2015-03-10 18:58:23 -07:00
currentPage . view . hidden = NO ;
2014-01-08 13:38:18 -08:00
self . navigationItem . backBarButtonItem = [ [ UIBarButtonItem alloc ]
initWithTitle : @ " "
style : UIBarButtonItemStylePlain
target : nil action : nil ] ;
2015-09-22 18:20:48 -07:00
UIInterfaceOrientation orientation = [ UIApplication sharedApplication ] . statusBarOrientation ;
[ self layoutForInterfaceOrientation : orientation ] ;
[ self adjustDragBar : orientation ] ;
2012-11-05 15:12:42 -08:00
}
2012-11-05 17:16:10 -08:00
- ( void ) viewDidAppear : ( BOOL ) animated {
2014-09-18 11:25:51 -07:00
[ super viewDidAppear : animated ] ;
2012-11-05 17:16:10 -08:00
// set the subscribeButton flag
2013-09-25 12:05:17 -07:00
if ( appDelegate . isTryFeedView && UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad ) {
2013-10-03 13:54:15 -07:00
self . subscribeButton . title = [ NSString stringWithFormat : @ "Follow %@" ,
2014-02-12 20:09:37 -08:00
[ appDelegate . storiesCollection . activeFeed objectForKey : @ "username" ] ] ;
2012-11-05 17:16:10 -08:00
self . navigationItem . leftBarButtonItem = self . subscribeButton ;
// self . subscribeButton . tintColor = UIColorFromRGB ( 0 x0a6720 ) ;
}
appDelegate . isTryFeedView = NO ;
2015-03-12 19:43:39 -07:00
[ self applyNewIndex : previousPage . pageIndex pageController : previousPage ] ;
2013-09-25 10:47:35 -07:00
previousPage . view . hidden = NO ;
}
2015-09-23 13:02:25 -07:00
- ( void ) viewDidLayoutSubviews {
[ super viewDidLayoutSubviews ] ;
2015-10-05 11:45:33 -07:00
// [ self reorientPages ] ;
2015-09-23 13:02:25 -07:00
}
2014-02-21 16:06:49 -08:00
- ( void ) viewDidDisappear : ( BOOL ) animated {
2014-09-18 11:25:51 -07:00
[ super viewDidDisappear : animated ] ;
2014-02-21 16:06:49 -08:00
self . navigationItem . leftBarButtonItem = nil ;
}
2013-09-25 10:47:35 -07:00
- ( void ) viewWillDisappear : ( BOOL ) animated {
2014-09-18 11:25:51 -07:00
[ super viewWillDisappear : animated ] ;
2013-09-25 10:47:35 -07:00
previousPage . view . hidden = YES ;
2013-10-11 17:46:09 -07:00
self . navigationController . interactivePopGestureRecognizer . enabled = YES ;
2012-11-05 17:16:10 -08:00
}
2012-11-07 17:54:16 -08:00
- ( void ) transitionFromFeedDetail {
2012-11-26 09:54:20 -08:00
// [ self performSelector : @ selector ( resetPages ) withObject : self afterDelay : 0.5 ] ;
2012-11-07 17:54:16 -08:00
[ appDelegate . masterContainerViewController transitionFromFeedDetail ] ;
}
2015-09-22 13:25:18 -07:00
- ( void ) viewWillTransitionToSize : ( CGSize ) size withTransitionCoordinator : ( id < UIViewControllerTransitionCoordinator > ) coordinator {
2015-09-22 16:34:24 -07:00
[ super viewWillTransitionToSize : size withTransitionCoordinator : coordinator ] ;
2015-09-22 13:25:18 -07:00
[ coordinator animateAlongsideTransition : ^ ( id < UIViewControllerTransitionCoordinatorContext > _Nonnull context ) {
UIInterfaceOrientation orientation = [ [ UIApplication sharedApplication ] statusBarOrientation ] ;
[ self layoutForInterfaceOrientation : orientation ] ;
[ self adjustDragBar : orientation ] ;
[ self reorientPages ] ;
} completion : ^ ( id < UIViewControllerTransitionCoordinatorContext > _Nonnull context ) {
} ] ;
}
2013-03-04 17:15:50 -08:00
- ( void ) layoutForInterfaceOrientation : ( UIInterfaceOrientation ) interfaceOrientation {
2014-03-03 12:52:26 -08:00
// if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad &&
2014-02-28 17:52:07 -08:00
// appDelegate . masterContainerViewController . originalViewIsVisible ) {
// return ;
// }
2014-09-22 12:35:38 -07:00
// NSLog ( @ "layout for stories: %@" , NSStringFromCGRect ( self . view . frame ) ) ;
2013-03-04 17:15:50 -08:00
if ( interfaceOrientation ! = _orientation ) {
_orientation = interfaceOrientation ;
2013-09-12 21:26:38 -07:00
if ( currentPage . pageIndex = = 0 ) {
previousPage . view . hidden = YES ;
}
2013-03-04 17:15:50 -08:00
}
2012-11-07 17:54:16 -08:00
}
2013-09-26 19:26:10 -07:00
- ( void ) adjustDragBar : ( UIInterfaceOrientation ) orientation {
2015-09-23 13:02:25 -07:00
// CGRect scrollViewFrame = self . scrollView . frame ;
// CGRect traverseViewFrame = self . traverseView . frame ;
2013-09-26 19:26:10 -07:00
if ( UI_USER _INTERFACE _IDIOM ( ) ! = UIUserInterfaceIdiomPad ||
UIInterfaceOrientationIsLandscape ( orientation ) ) {
2015-09-23 13:02:25 -07:00
// scrollViewFrame . size . height = self . view . bounds . size . height ;
// self . bottomSize . hidden = YES ;
[ self . bottomSizeHeightConstraint setConstant : 0 ] ;
2013-09-26 19:26:10 -07:00
} else {
2015-09-23 13:02:25 -07:00
// scrollViewFrame . size . height = self . view . bounds . size . height - 12 ;
// self . bottomSize . hidden = NO ;
[ self . bottomSizeHeightConstraint setConstant : 12 ] ;
2013-09-26 19:26:10 -07:00
}
2015-09-28 20:01:17 -07:00
[ self . view layoutIfNeeded ] ;
2015-09-22 18:20:48 -07:00
// self . scrollView . frame = scrollViewFrame ;
// traverseViewFrame . origin . y = scrollViewFrame . size . height - traverseViewFrame . size . height ;
// self . traverseView . frame = traverseViewFrame ;
2013-09-26 19:26:10 -07:00
}
2013-10-08 13:57:15 -07:00
- ( void ) highlightButton : ( UIButton * ) b {
2013-10-10 13:00:35 -07:00
if ( ! [ b isKindOfClass : [ UIButton class ] ] ) return ;
2013-10-08 13:57:15 -07:00
[ b setHighlighted : YES ] ;
}
- ( void ) unhighlightButton : ( UIButton * ) b {
2013-10-10 13:00:35 -07:00
if ( ! [ b isKindOfClass : [ UIButton class ] ] ) return ;
2013-10-08 13:57:15 -07:00
[ b setHighlighted : NO ] ;
}
- ( IBAction ) beginTouchDown : ( UIButton * ) sender {
[ self performSelector : @ selector ( highlightButton : ) withObject : sender afterDelay : 0.0 ] ;
}
- ( IBAction ) endTouchDown : ( UIButton * ) sender {
if ( ! sender ) return ;
[ self performSelector : @ selector ( unhighlightButton : ) withObject : sender afterDelay : 0.2 ] ;
}
2012-11-08 18:30:45 -08:00
- ( void ) resetPages {
2014-01-07 18:26:17 -08:00
self . navigationItem . titleView = nil ;
2012-11-07 17:54:16 -08:00
[ currentPage clearStory ] ;
[ nextPage clearStory ] ;
2012-11-26 09:54:20 -08:00
[ previousPage clearStory ] ;
2012-11-09 09:31:26 -08:00
2012-11-26 09:54:20 -08:00
CGRect frame = self . scrollView . frame ;
self . scrollView . contentSize = frame . size ;
2012-11-26 16:47:20 -08:00
2015-03-12 19:43:39 -07:00
NSLog ( @ "Pages are at: %f / %f / %f (%@)" , previousPage . view . frame . origin . x , currentPage . view . frame . origin . x , nextPage . view . frame . origin . x , NSStringFromCGRect ( frame ) ) ;
2012-12-11 12:01:49 -08:00
currentPage . view . frame = self . scrollView . frame ;
nextPage . view . frame = self . scrollView . frame ;
previousPage . view . frame = self . scrollView . frame ;
2012-11-26 16:47:20 -08:00
currentPage . pageIndex = -2 ;
nextPage . pageIndex = -2 ;
previousPage . pageIndex = -2 ;
2013-10-11 17:46:09 -07:00
}
- ( void ) hidePages {
[ currentPage hideStory ] ;
[ nextPage hideStory ] ;
[ previousPage hideStory ] ;
2012-11-07 17:54:16 -08:00
}
2012-11-13 12:28:16 -08:00
- ( void ) refreshPages {
2013-09-25 17:43:00 -07:00
NSInteger pageIndex = currentPage . pageIndex ;
2012-11-13 12:28:16 -08:00
[ self resizeScrollView ] ;
[ appDelegate adjustStoryDetailWebView ] ;
2012-11-14 17:31:52 -08:00
currentPage . pageIndex = -2 ;
nextPage . pageIndex = -2 ;
previousPage . pageIndex = -2 ;
2012-11-13 12:28:16 -08:00
[ self changePage : pageIndex animated : NO ] ;
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
// self . scrollView . contentOffset = CGPointMake ( self . scrollView . frame . size . width * currentPage . pageIndex , 0 ) ;
}
2015-09-22 13:25:18 -07:00
- ( void ) reorientPages {
2014-12-03 15:35:37 -08:00
[ self applyNewIndex : currentPage . pageIndex -1 pageController : previousPage supressRedraw : YES ] ;
[ self applyNewIndex : currentPage . pageIndex + 1 pageController : nextPage supressRedraw : YES ] ;
2014-11-30 21:24:42 -05:00
[ self applyNewIndex : currentPage . pageIndex pageController : currentPage supressRedraw : YES ] ;
2014-12-03 15:35:37 -08:00
NSInteger currentIndex = currentPage . pageIndex ;
[ self resizeScrollView ] ; // Will change currentIndex , so preserve
// Scroll back to preserved index
2014-11-30 21:24:42 -05:00
CGRect frame = self . scrollView . frame ;
2014-12-03 15:35:37 -08:00
frame . origin . x = frame . size . width * currentIndex ;
2014-11-30 21:24:42 -05:00
frame . origin . y = 0 ;
[ self . scrollView scrollRectToVisible : frame animated : NO ] ;
[ MBProgressHUD hideHUDForView : self . view animated : YES ] ;
}
2012-12-07 17:18:31 -08:00
- ( void ) refreshHeaders {
2014-02-12 20:09:37 -08:00
[ currentPage setActiveStoryAtIndex : [ appDelegate . storiesCollection
indexOfStoryId : currentPage . activeStoryId ] ] ;
[ nextPage setActiveStoryAtIndex : [ appDelegate . storiesCollection
indexOfStoryId : nextPage . activeStoryId ] ] ;
[ previousPage setActiveStoryAtIndex : [ appDelegate . storiesCollection
indexOfStoryId : previousPage . activeStoryId ] ] ;
2013-10-01 14:19:12 -07:00
2012-12-07 17:18:31 -08:00
[ currentPage refreshHeader ] ;
[ nextPage refreshHeader ] ;
[ previousPage refreshHeader ] ;
2014-05-21 12:24:22 -07:00
[ currentPage refreshSideoptions ] ;
[ nextPage refreshSideoptions ] ;
[ previousPage refreshSideoptions ] ;
2012-12-07 17:18:31 -08:00
}
2012-11-06 17:26:08 -08:00
- ( void ) resizeScrollView {
2014-02-12 20:09:37 -08:00
NSInteger widthCount = appDelegate . storiesCollection . storyLocationsCount ;
2012-11-06 17:26:08 -08:00
if ( widthCount = = 0 ) {
widthCount = 1 ;
}
self . scrollView . contentSize = CGSizeMake ( self . scrollView . frame . size . width
* widthCount ,
self . scrollView . frame . size . height ) ;
}
2012-11-07 17:54:16 -08:00
- ( void ) touchesMoved : ( NSSet * ) touches withEvent : ( UIEvent * ) event {
UIInterfaceOrientation orientation = [ UIApplication sharedApplication ] . statusBarOrientation ;
2013-10-03 13:54:15 -07:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad &&
UIInterfaceOrientationIsPortrait ( orientation ) ) {
2012-11-07 17:54:16 -08:00
UITouch * theTouch = [ touches anyObject ] ;
2013-12-12 18:41:39 -08:00
CGPoint tappedPt = [ theTouch locationInView : self . view ] ;
NSInteger fudge = appDelegate . masterContainerViewController . storyTitlesOnLeft ? -30 : -20 ;
BOOL inside = CGRectContainsPoint ( CGRectInset ( self . bottomSize . frame , 0 , fudge ) , tappedPt ) ;
BOOL attached = self . inTouchMove ;
if ( theTouch . view = = self . bottomSize || inside || attached ) {
2012-11-07 17:54:16 -08:00
self . inTouchMove = YES ;
2013-09-26 19:26:10 -07:00
CGPoint touchLocation = [ theTouch locationInView : self . view ] ;
CGFloat y = touchLocation . y ;
[ appDelegate . masterContainerViewController dragStoryToolbar : y ] ;
2012-11-07 17:54:16 -08:00
}
}
}
- ( void ) touchesEnded : ( NSSet * ) touches withEvent : ( UIEvent * ) event {
UIInterfaceOrientation orientation = [ UIApplication sharedApplication ] . statusBarOrientation ;
2013-10-03 13:54:15 -07:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad &&
UIInterfaceOrientationIsPortrait ( orientation ) ) {
2013-12-12 18:41:39 -08:00
if ( self . inTouchMove ) {
2012-11-07 17:54:16 -08:00
self . inTouchMove = NO ;
[ appDelegate . masterContainerViewController adjustFeedDetailScreenForStoryTitles ] ;
}
}
}
# pragma mark -
# pragma mark Side scroll view
2013-10-03 13:54:15 -07:00
- ( void ) applyNewIndex : ( NSInteger ) newIndex
pageController : ( StoryDetailViewController * ) pageController {
2014-11-30 21:24:42 -05:00
[ self applyNewIndex : newIndex pageController : pageController supressRedraw : NO ] ;
}
- ( void ) applyNewIndex : ( NSInteger ) newIndex
pageController : ( StoryDetailViewController * ) pageController
supressRedraw : ( BOOL ) suppressRedraw {
2014-02-12 20:09:37 -08:00
NSInteger pageCount = [ [ appDelegate . storiesCollection activeFeedStoryLocations ] count ] ;
2012-11-05 15:12:42 -08:00
BOOL outOfBounds = newIndex >= pageCount || newIndex < 0 ;
if ( ! outOfBounds ) {
2015-09-22 16:34:24 -07:00
CGRect pageFrame = pageController . view . bounds ;
2012-11-05 15:12:42 -08:00
pageFrame . origin . y = 0 ;
2015-09-22 16:34:24 -07:00
pageFrame . origin . x = CGRectGetWidth ( self . view . bounds ) * newIndex ;
pageFrame . size . height = CGRectGetHeight ( self . view . bounds ) ;
2012-12-18 17:29:23 -08:00
pageController . view . hidden = NO ;
2012-11-05 15:12:42 -08:00
pageController . view . frame = pageFrame ;
} else {
2012-11-14 17:31:52 -08:00
// NSLog ( @ "Out of bounds: was %d, now %d" , pageController . pageIndex , newIndex ) ;
2015-09-22 16:34:24 -07:00
CGRect pageFrame = pageController . view . bounds ;
pageFrame . origin . x = CGRectGetWidth ( self . view . bounds ) * newIndex ;
pageFrame . origin . y = CGRectGetHeight ( self . view . bounds ) ;
pageFrame . size . height = CGRectGetHeight ( self . view . bounds ) ;
2012-12-18 17:29:23 -08:00
pageController . view . hidden = YES ;
2012-11-05 15:12:42 -08:00
pageController . view . frame = pageFrame ;
}
2014-11-30 21:24:42 -05:00
if ( suppressRedraw ) return ;
2015-05-19 11:10:59 -07:00
// NSInteger wasIndex = pageController . pageIndex ;
2012-11-05 15:12:42 -08:00
pageController . pageIndex = newIndex ;
2015-04-26 21:22:25 -07:00
// NSLog ( @ "Applied Index to %@: Was %ld, now %ld (%ld/%ld/%ld) [%lu stories - %d] %@" , pageController , ( long ) wasIndex , ( long ) newIndex , ( long ) previousPage . pageIndex , ( long ) currentPage . pageIndex , ( long ) nextPage . pageIndex , ( unsigned long ) [ appDelegate . storiesCollection . activeFeedStoryLocations count ] , outOfBounds , NSStringFromCGRect ( self . scrollView . frame ) ) ;
2012-11-05 15:12:42 -08:00
2014-02-12 20:09:37 -08:00
if ( newIndex > 0 && newIndex >= [ appDelegate . storiesCollection . activeFeedStoryLocations count ] ) {
2012-12-06 15:30:16 -08:00
pageController . pageIndex = -2 ;
2014-02-27 14:49:33 -08:00
if ( self . appDelegate . storiesCollection . feedPage < 100 &&
2012-11-05 18:23:45 -08:00
! self . appDelegate . feedDetailViewController . pageFinished &&
! self . appDelegate . feedDetailViewController . pageFetching ) {
[ self . appDelegate . feedDetailViewController fetchNextPage : ^ ( ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Fetched next page, %d stories" , [ appDelegate . activeFeedStoryLocations count ] ) ;
2012-11-05 18:23:45 -08:00
[ self applyNewIndex : newIndex pageController : pageController ] ;
} ] ;
2012-12-06 15:30:16 -08:00
} else if ( ! self . appDelegate . feedDetailViewController . pageFinished &&
! self . appDelegate . feedDetailViewController . pageFetching ) {
[ appDelegate . navigationController
popToViewController : [ appDelegate . navigationController . viewControllers
objectAtIndex : 0 ]
animated : YES ] ;
[ appDelegate hideStoryDetailView ] ;
2012-11-05 18:23:45 -08:00
}
2012-11-14 17:31:52 -08:00
} else if ( ! outOfBounds ) {
2014-02-12 20:09:37 -08:00
NSInteger location = [ appDelegate . storiesCollection indexFromLocation : pageController . pageIndex ] ;
2012-11-06 13:45:15 -08:00
[ pageController setActiveStoryAtIndex : location ] ;
2012-11-14 17:31:52 -08:00
[ pageController clearStory ] ;
2012-11-19 19:15:05 -08:00
if ( self . isDraggingScrollview ||
2012-11-26 16:47:20 -08:00
self . scrollingToPage < 0 ||
2013-09-25 17:43:00 -07:00
ABS ( newIndex - self . scrollingToPage ) <= 1 ) {
2015-10-02 16:04:49 -07:00
[ pageController drawFeedGradient ] ;
dispatch_async ( dispatch_get _global _queue ( DISPATCH_QUEUE _PRIORITY _HIGH , 0 ul ) , ^ {
[ pageController initStory ] ;
[ pageController drawStory ] ;
2015-10-05 11:45:33 -07:00
[ pageController showTextOrStoryView ] ;
2015-10-02 16:04:49 -07:00
} ) ;
2012-11-14 17:31:52 -08:00
} else {
2015-03-10 18:58:23 -07:00
// [ pageController clearStory ] ;
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Skipping drawing %d (waiting for %d)" , newIndex , self . scrollingToPage ) ;
2012-11-14 17:31:52 -08:00
}
} else if ( outOfBounds ) {
[ pageController clearStory ] ;
2012-11-05 18:23:45 -08:00
}
2012-11-05 17:16:10 -08:00
2014-12-03 15:35:37 -08:00
if ( ! suppressRedraw ) {
[ self resizeScrollView ] ;
}
2013-05-29 13:36:39 -07:00
[ self setTextButton ] ;
2012-11-05 17:16:10 -08:00
[ self . loadingIndicator stopAnimating ] ;
2013-04-23 11:52:34 -07:00
self . circularProgressView . hidden = NO ;
2012-11-05 15:12:42 -08:00
}
2012-11-14 17:31:52 -08:00
- ( void ) scrollViewDidScroll : ( UIScrollView * ) sender {
2012-11-26 09:54:20 -08:00
// [ sender setContentOffset : CGPointMake ( sender . contentOffset . x , 0 ) ] ;
2014-12-03 15:35:37 -08:00
if ( inRotation ) return ;
2012-11-05 15:12:42 -08:00
CGFloat pageWidth = self . scrollView . frame . size . width ;
float fractionalPage = self . scrollView . contentOffset . x / pageWidth ;
NSInteger lowerNumber = floor ( fractionalPage ) ;
NSInteger upperNumber = lowerNumber + 1 ;
2012-11-14 17:31:52 -08:00
NSInteger previousNumber = lowerNumber - 1 ;
2012-11-05 15:12:42 -08:00
2014-02-12 20:09:37 -08:00
NSInteger storyCount = [ appDelegate . storiesCollection . activeFeedStoryLocations count ] ;
2012-11-26 09:54:20 -08:00
if ( storyCount = = 0 || lowerNumber > storyCount ) return ;
2012-11-14 17:31:52 -08:00
// NSLog ( @ "Did Scroll: %f = %d (%d/%d/%d)" , fractionalPage , lowerNumber , previousPage . pageIndex , currentPage . pageIndex , nextPage . pageIndex ) ;
if ( lowerNumber = = currentPage . pageIndex ) {
if ( upperNumber ! = nextPage . pageIndex ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Next was %d, now %d (A)" , nextPage . pageIndex , upperNumber ) ;
2012-11-05 15:12:42 -08:00
[ self applyNewIndex : upperNumber pageController : nextPage ] ;
}
2012-11-14 17:31:52 -08:00
if ( previousNumber ! = previousPage . pageIndex ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Prev was %d, now %d (A)" , previousPage . pageIndex , previousNumber ) ;
2012-11-14 17:31:52 -08:00
[ self applyNewIndex : previousNumber pageController : previousPage ] ;
2012-11-05 15:12:42 -08:00
}
2012-11-14 17:31:52 -08:00
} else if ( upperNumber = = currentPage . pageIndex ) {
// Going backwards
if ( lowerNumber ! = previousPage . pageIndex ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Prev was %d, now %d (B)" , previousPage . pageIndex , previousNumber ) ;
2012-11-14 17:31:52 -08:00
[ self applyNewIndex : lowerNumber pageController : previousPage ] ;
2012-11-05 15:12:42 -08:00
}
2012-11-14 17:31:52 -08:00
} else {
// Going forwards
if ( lowerNumber = = nextPage . pageIndex ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Prev was %d, now %d (C1)" , previousPage . pageIndex , previousNumber ) ;
2012-11-14 17:31:52 -08:00
// [ self applyNewIndex : upperNumber pageController : nextPage ] ;
// [ self applyNewIndex : lowerNumber pageController : currentPage ] ;
[ self applyNewIndex : previousNumber pageController : previousPage ] ;
} else if ( upperNumber = = nextPage . pageIndex ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Prev was %d, now %d (C2)" , previousPage . pageIndex , previousNumber ) ;
2012-11-05 15:12:42 -08:00
[ self applyNewIndex : lowerNumber pageController : currentPage ] ;
2012-11-14 17:31:52 -08:00
[ self applyNewIndex : previousNumber pageController : previousPage ] ;
} else {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Next was %d, now %d (C3)" , nextPage . pageIndex , upperNumber ) ;
// NSLog ( @ "Current was %d, now %d (C3)" , currentPage . pageIndex , lowerNumber ) ;
// NSLog ( @ "Prev was %d, now %d (C3)" , previousPage . pageIndex , previousNumber ) ;
2012-11-05 15:12:42 -08:00
[ self applyNewIndex : lowerNumber pageController : currentPage ] ;
[ self applyNewIndex : upperNumber pageController : nextPage ] ;
2012-11-26 09:54:20 -08:00
[ self applyNewIndex : previousNumber pageController : previousPage ] ;
2012-11-05 15:12:42 -08:00
}
}
2012-11-26 09:54:20 -08:00
// if ( self . isDraggingScrollview ) {
[ self setStoryFromScroll ] ;
// }
2013-03-07 10:55:23 -05:00
// Stick to bottom
CGRect tvf = self . traverseView . frame ;
traversePinned = YES ;
2015-09-22 18:20:48 -07:00
[ UIView animateWithDuration : .24 delay : 0
2013-03-07 10:55:23 -05:00
options : UIViewAnimationOptionCurveEaseInOut
animations : ^ {
2015-09-22 18:20:48 -07:00
[ self . traverseView setNeedsLayout ] ;
2013-03-07 10:55:23 -05:00
self . traverseView . frame = CGRectMake ( tvf . origin . x ,
2015-09-23 13:02:25 -07:00
self . view . bounds . size . height - tvf . size . height - bottomSizeHeightConstraint . constant ,
2013-03-07 10:55:23 -05:00
tvf . size . width , tvf . size . height ) ;
2013-03-13 14:05:58 -07:00
self . traverseView . alpha = 1 ;
self . traversePinned = YES ;
2013-03-07 10:55:23 -05:00
} completion : ^ ( BOOL finished ) {
} ] ;
2012-11-05 15:12:42 -08:00
}
2012-11-08 18:30:45 -08:00
- ( void ) scrollViewWillBeginDragging : ( UIScrollView * ) scrollView {
self . isDraggingScrollview = YES ;
}
2012-11-14 17:31:52 -08:00
- ( void ) scrollViewDidEndDecelerating : ( UIScrollView * ) newScrollView
{
[ self scrollViewDidEndScrollingAnimation : newScrollView ] ;
}
2012-11-05 15:12:42 -08:00
- ( void ) scrollViewDidEndScrollingAnimation : ( UIScrollView * ) newScrollView
{
2012-11-08 18:30:45 -08:00
self . isDraggingScrollview = NO ;
2012-11-14 17:31:52 -08:00
CGFloat pageWidth = self . scrollView . frame . size . width ;
float fractionalPage = self . scrollView . contentOffset . x / pageWidth ;
NSInteger nearestNumber = lround ( fractionalPage ) ;
self . scrollingToPage = nearestNumber ;
2012-11-08 17:39:32 -08:00
[ self setStoryFromScroll ] ;
2012-11-05 15:12:42 -08:00
}
2013-10-03 13:54:15 -07:00
- ( void ) observeValueForKeyPath : ( NSString * ) keyPath
ofObject : ( id ) object
change : ( NSDictionary * ) change
context : ( void * ) context {
2012-11-19 19:15:05 -08:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad &&
2013-02-06 15:15:43 -08:00
[ keyPath isEqual : @ "contentOffset" ] &&
2012-11-19 19:15:05 -08:00
self . isDraggingScrollview ) {
2012-11-08 18:30:45 -08:00
CGFloat pageWidth = self . scrollView . frame . size . width ;
float fractionalPage = self . scrollView . contentOffset . x / pageWidth ;
NSInteger nearestNumber = lround ( fractionalPage ) ;
2014-02-12 20:09:37 -08:00
if ( ! [ appDelegate . storiesCollection . activeFeedStories count ] ) return ;
2012-11-28 15:21:44 -08:00
2014-02-12 20:09:37 -08:00
NSInteger storyIndex = [ appDelegate . storiesCollection indexFromLocation : nearestNumber ] ;
if ( storyIndex ! = [ appDelegate . storiesCollection indexOfActiveStory ] ) {
appDelegate . activeStory = [ appDelegate . storiesCollection . activeFeedStories
objectAtIndex : storyIndex ] ;
2012-11-19 19:15:05 -08:00
[ appDelegate changeActiveFeedDetailRow ] ;
}
2012-11-08 18:30:45 -08:00
}
}
2014-02-24 18:35:35 -08:00
- ( void ) animateIntoPlace : ( BOOL ) animated {
2014-01-30 20:28:08 -08:00
// Move view into position if no story is selected yet
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad &&
! self . isAnimatedIntoPlace ) {
CGRect frame = self . scrollView . frame ;
frame . origin . x = frame . size . width ;
self . scrollView . frame = frame ;
2014-02-24 18:35:35 -08:00
[ UIView animateWithDuration : ( animated ? .22 : 0 ) delay : 0
options : UIViewAnimationOptionCurveEaseInOut
animations : ^
{
2014-01-30 20:28:08 -08:00
CGRect frame = self . scrollView . frame ;
frame . origin . x = 0 ;
self . scrollView . frame = frame ;
} completion : ^ ( BOOL finished ) {
self . isAnimatedIntoPlace = YES ;
} ] ;
}
}
2012-11-05 18:23:45 -08:00
- ( void ) changePage : ( NSInteger ) pageIndex {
2012-11-09 11:39:36 -08:00
[ self changePage : pageIndex animated : YES ] ;
}
- ( void ) changePage : ( NSInteger ) pageIndex animated : ( BOOL ) animated {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "changePage to %d (animated: %d)" , pageIndex , animated ) ;
2012-11-05 18:23:45 -08:00
// update the scroll view to the appropriate page
2012-11-06 17:26:08 -08:00
[ self resizeScrollView ] ;
2012-11-05 18:23:45 -08:00
CGRect frame = self . scrollView . frame ;
frame . origin . x = frame . size . width * pageIndex ;
frame . origin . y = 0 ;
2012-11-09 14:57:33 -08:00
2012-11-14 17:31:52 -08:00
self . scrollingToPage = pageIndex ;
2013-09-12 21:26:38 -07:00
[ self . currentPage hideNoStoryMessage ] ;
[ self . nextPage hideNoStoryMessage ] ;
[ self . previousPage hideNoStoryMessage ] ;
2012-11-28 15:46:11 -08:00
// Check if already on the selected page
2012-11-08 17:39:32 -08:00
if ( self . scrollView . contentOffset . x = = frame . origin . x ) {
[ self applyNewIndex : pageIndex pageController : currentPage ] ;
[ self setStoryFromScroll ] ;
} else {
2012-11-09 11:39:36 -08:00
[ self . scrollView scrollRectToVisible : frame animated : animated ] ;
if ( ! animated ) {
[ self setStoryFromScroll ] ;
}
2012-11-08 17:39:32 -08:00
}
2012-11-05 18:23:45 -08:00
}
2012-11-08 17:39:32 -08:00
- ( void ) setStoryFromScroll {
2012-11-26 09:54:20 -08:00
[ self setStoryFromScroll : NO ] ;
}
- ( void ) setStoryFromScroll : ( BOOL ) force {
2012-11-08 17:39:32 -08:00
CGFloat pageWidth = self . scrollView . frame . size . width ;
float fractionalPage = self . scrollView . contentOffset . x / pageWidth ;
NSInteger nearestNumber = lround ( fractionalPage ) ;
2012-11-07 17:54:16 -08:00
2013-09-23 18:09:05 -07:00
if ( ! force && currentPage . pageIndex >= 0 &&
2012-11-26 09:54:20 -08:00
currentPage . pageIndex = = nearestNumber &&
currentPage . pageIndex ! = self . scrollingToPage ) {
2012-11-26 16:47:20 -08:00
// NSLog ( @ "Skipping setStoryFromScroll: currentPage is %d (%d, %d)" , currentPage . pageIndex , nearestNumber , self . scrollingToPage ) ;
2012-11-26 09:54:20 -08:00
return ;
}
2012-11-19 19:15:05 -08:00
2012-11-14 17:31:52 -08:00
if ( currentPage . pageIndex < nearestNumber ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Swap next into current, current into previous: %d / %d" , currentPage . pageIndex , nearestNumber ) ;
2012-11-14 17:31:52 -08:00
StoryDetailViewController * swapCurrentController = currentPage ;
StoryDetailViewController * swapPreviousController = previousPage ;
2012-11-08 17:39:32 -08:00
currentPage = nextPage ;
2012-11-14 17:31:52 -08:00
previousPage = swapCurrentController ;
nextPage = swapPreviousController ;
} else if ( currentPage . pageIndex > nearestNumber ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Swap previous into current: %d / %d" , currentPage . pageIndex , nearestNumber ) ;
2012-11-14 17:31:52 -08:00
StoryDetailViewController * swapCurrentController = currentPage ;
StoryDetailViewController * swapNextController = nextPage ;
currentPage = previousPage ;
nextPage = swapCurrentController ;
previousPage = swapNextController ;
}
2012-11-07 17:54:16 -08:00
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Set Story from scroll: %f = %d (%d/%d/%d)" , fractionalPage , nearestNumber , previousPage . pageIndex , currentPage . pageIndex , nextPage . pageIndex ) ;
2012-11-08 18:30:45 -08:00
2012-11-13 12:28:16 -08:00
nextPage . webView . scrollView . scrollsToTop = NO ;
2012-11-14 17:31:52 -08:00
previousPage . webView . scrollView . scrollsToTop = NO ;
2012-11-13 12:28:16 -08:00
currentPage . webView . scrollView . scrollsToTop = YES ;
2013-10-07 10:02:44 -07:00
currentPage . isRecentlyUnread = NO ;
2012-11-26 09:54:20 -08:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad ) {
appDelegate . feedDetailViewController . storyTitlesTable . scrollsToTop = NO ;
}
2012-11-13 12:28:16 -08:00
self . scrollView . scrollsToTop = NO ;
2012-11-26 09:54:20 -08:00
if ( self . isDraggingScrollview || self . scrollingToPage = = currentPage . pageIndex ) {
2013-01-07 16:34:59 -08:00
if ( currentPage . pageIndex = = -2 ) return ;
2012-11-26 09:54:20 -08:00
self . scrollingToPage = -1 ;
2014-02-12 20:09:37 -08:00
NSInteger storyIndex = [ appDelegate . storiesCollection indexFromLocation : currentPage . pageIndex ] ;
appDelegate . activeStory = [ appDelegate . storiesCollection . activeFeedStories objectAtIndex : storyIndex ] ;
2012-11-26 09:54:20 -08:00
[ self updatePageWithActiveStory : currentPage . pageIndex ] ;
2014-03-05 14:13:49 -08:00
if ( [ appDelegate . storiesCollection isStoryUnread : appDelegate . activeStory ] ) {
[ appDelegate . storiesCollection markStoryRead : appDelegate . activeStory ] ;
[ appDelegate . storiesCollection syncStoryAsRead : appDelegate . activeStory ] ;
}
[ appDelegate . feedDetailViewController redrawUnreadStory ] ;
2012-11-26 09:54:20 -08:00
}
2012-11-08 17:39:32 -08:00
}
2012-12-13 16:41:52 -08:00
- ( void ) advanceToNextUnread {
if ( ! self . waitingForNextUnreadFromServer ) {
return ;
}
self . waitingForNextUnreadFromServer = NO ;
2013-10-08 13:57:15 -07:00
[ self doNextUnreadStory : nil ] ;
2012-12-13 16:41:52 -08:00
}
2013-09-25 10:47:35 -07:00
- ( void ) updatePageWithActiveStory : ( NSInteger ) location {
2014-02-12 20:41:29 -08:00
[ appDelegate . storiesCollection pushReadStory : [ appDelegate . activeStory objectForKey : @ "story_hash" ] ] ;
2012-11-05 17:16:10 -08:00
2015-09-23 13:02:25 -07:00
// [ self . view setNeedsLayout ] ;
2012-11-05 17:16:10 -08:00
2013-03-04 17:15:50 -08:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad ) {
2013-10-11 17:46:09 -07:00
self . navigationItem . rightBarButtonItems = [ NSArray arrayWithObjects :
originalStoryButton ,
separatorBarButton ,
fontSettingsButton , nil ] ;
2013-03-04 17:15:50 -08:00
}
2012-11-05 17:16:10 -08:00
[ self setNextPreviousButtons ] ;
2014-09-18 16:55:37 -07:00
EventWindow * tapDetectingWindow = ( EventWindow * ) appDelegate . window ;
tapDetectingWindow . tapDetectingView = currentPage . view ;
2012-11-07 17:54:16 -08:00
[ appDelegate changeActiveFeedDetailRow ] ;
2012-11-08 17:39:32 -08:00
if ( self . currentPage . pageIndex ! = location ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Updating Current: from %d to %d" , currentPage . pageIndex , location ) ;
2012-11-08 17:39:32 -08:00
[ self applyNewIndex : location pageController : self . currentPage ] ;
}
if ( self . nextPage . pageIndex ! = location + 1 ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Updating Next: from %d to %d" , nextPage . pageIndex , location + 1 ) ;
2012-11-08 17:39:32 -08:00
[ self applyNewIndex : location + 1 pageController : self . nextPage ] ;
}
2012-11-14 17:31:52 -08:00
if ( self . previousPage . pageIndex ! = location -1 ) {
2013-01-07 16:34:59 -08:00
// NSLog ( @ "Updating Previous: from %d to %d" , previousPage . pageIndex , location -1 ) ;
2012-11-14 17:31:52 -08:00
[ self applyNewIndex : location -1 pageController : self . previousPage ] ;
}
2012-11-05 15:12:42 -08:00
}
2013-02-06 18:42:15 -08:00
- ( void ) requestFailed : ( id ) request {
2013-09-06 14:31:12 -07:00
[ self informError : @ "The server barfed!" ] ;
2012-11-05 17:16:10 -08:00
}
# pragma mark -
# pragma mark Actions
- ( void ) setNextPreviousButtons {
// setting up the PREV BUTTON
2013-09-25 10:47:35 -07:00
NSInteger readStoryCount = [ appDelegate . readStories count ] ;
2012-11-05 17:16:10 -08:00
if ( readStoryCount = = 0 ||
( readStoryCount = = 1 &&
2014-02-12 20:41:29 -08:00
[ appDelegate . readStories lastObject ] = = [ appDelegate . activeStory objectForKey : @ "story_hash" ] ) ) {
2013-07-19 16:49:48 -07:00
[ buttonPrevious setEnabled : NO ] ;
} else {
[ buttonPrevious setEnabled : YES ] ;
}
2012-11-05 17:16:10 -08:00
// setting up the NEXT UNREAD STORY BUTTON
2013-03-05 17:00:03 -08:00
buttonNext . enabled = YES ;
2014-02-12 20:09:37 -08:00
NSInteger nextIndex = [ appDelegate . storiesCollection indexOfNextUnreadStory ] ;
2013-09-25 10:47:35 -07:00
NSInteger unreadCount = [ appDelegate unreadCount ] ;
2014-04-18 14:48:38 -07:00
BOOL pageFinished = self . appDelegate . feedDetailViewController . pageFinished ;
if ( ( nextIndex = = -1 && unreadCount > 0 && ! pageFinished ) ||
2013-03-05 17:00:03 -08:00
nextIndex ! = -1 ) {
2013-10-02 16:05:22 -07:00
[ buttonNext setTitle : [ @ "Next" uppercaseString ] forState : UIControlStateNormal ] ;
2013-10-03 13:54:15 -07:00
[ buttonNext setBackgroundImage : [ UIImage imageNamed : @ "traverse_next.png" ]
forState : UIControlStateNormal ] ;
2012-11-05 17:16:10 -08:00
} else {
2013-10-02 16:05:22 -07:00
[ buttonNext setTitle : [ @ "Done" uppercaseString ] forState : UIControlStateNormal ] ;
2013-10-03 13:54:15 -07:00
[ buttonNext setBackgroundImage : [ UIImage imageNamed : @ "traverse_done.png" ]
forState : UIControlStateNormal ] ;
2012-11-05 17:16:10 -08:00
}
float unreads = ( float ) [ appDelegate unreadCount ] ;
float total = [ appDelegate originalStoryCount ] ;
float progress = ( total - unreads ) / total ;
2013-04-10 21:06:17 -07:00
circularProgressView . percentage = progress ;
2012-11-05 17:16:10 -08:00
}
2013-05-29 13:36:39 -07:00
- ( void ) setTextButton {
2015-03-09 14:20:45 -07:00
[ self setTextButton : currentPage ] ;
}
- ( void ) setTextButton : ( StoryDetailViewController * ) storyViewController {
2015-03-10 18:58:23 -07:00
if ( storyViewController ! = currentPage ) return ;
2015-03-09 14:20:45 -07:00
if ( storyViewController . pageIndex >= 0 ) {
2013-05-30 16:31:57 -07:00
[ buttonText setEnabled : YES ] ;
[ buttonText setAlpha : 1 ] ;
2013-07-19 18:19:30 -07:00
[ buttonSend setEnabled : YES ] ;
[ buttonSend setAlpha : 1 ] ;
2013-05-30 16:31:57 -07:00
} else {
[ buttonText setEnabled : NO ] ;
[ buttonText setAlpha : .4 ] ;
2013-07-19 18:19:30 -07:00
[ buttonSend setEnabled : NO ] ;
[ buttonSend setAlpha : .4 ] ;
2013-05-30 16:31:57 -07:00
}
2015-03-09 14:20:45 -07:00
if ( storyViewController . inTextView ) {
2013-05-29 13:36:39 -07:00
[ buttonText setTitle : [ @ "Story" uppercaseString ] forState : UIControlStateNormal ] ;
[ buttonText setBackgroundImage : [ UIImage imageNamed : @ "traverse_text_on.png" ]
forState : nil ] ;
2013-10-02 17:31:51 -07:00
self . buttonText . titleEdgeInsets = UIEdgeInsetsMake ( 0 , 26 , 0 , 0 ) ;
2013-05-29 13:36:39 -07:00
} else {
[ buttonText setTitle : [ @ "Text" uppercaseString ] forState : UIControlStateNormal ] ;
[ buttonText setBackgroundImage : [ UIImage imageNamed : @ "traverse_text.png" ]
forState : nil ] ;
2013-10-02 17:31:51 -07:00
self . buttonText . titleEdgeInsets = UIEdgeInsetsMake ( 0 , 22 , 0 , 0 ) ;
2013-05-29 13:36:39 -07:00
}
}
2013-07-19 16:49:48 -07:00
- ( IBAction ) openSendToDialog : ( id ) sender {
2013-10-08 13:57:15 -07:00
[ self endTouchDown : sender ] ;
2015-01-28 13:38:52 -08:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad ) {
[ appDelegate . masterContainerViewController showSendToPopover : sender ] ;
}
2014-01-06 18:37:57 -08:00
[ appDelegate showSendTo : self sender : sender ] ;
2012-11-05 17:16:10 -08:00
}
2013-06-16 08:15:40 -07:00
- ( void ) finishMarkAsSaved : ( ASIFormDataRequest * ) request {
2012-11-05 17:16:10 -08:00
if ( [ request responseStatusCode ] ! = 200 ) {
return [ self requestFailed : request ] ;
}
2013-08-05 17:29:42 -07:00
[ appDelegate . feedDetailViewController redrawUnreadStory ] ;
[ self refreshHeaders ] ;
2012-12-18 17:29:23 -08:00
[ self . currentPage flashCheckmarkHud : @ "saved" ] ;
2012-11-05 17:16:10 -08:00
}
2014-03-05 14:13:49 -08:00
- ( BOOL ) failedMarkAsSaved : ( ASIFormDataRequest * ) request {
if ( ! [ [ request . userInfo objectForKey : @ "story_hash" ]
isEqualToString : [ currentPage . activeStory objectForKey : @ "story_hash" ] ] ) {
return NO ;
}
[ self informError : @ "Failed to save story" ] ;
return YES ;
2012-11-05 17:16:10 -08:00
}
2013-06-16 08:15:40 -07:00
- ( void ) finishMarkAsUnsaved : ( ASIFormDataRequest * ) request {
2012-11-05 17:16:10 -08:00
if ( [ request responseStatusCode ] ! = 200 ) {
return [ self requestFailed : request ] ;
}
2014-03-05 14:13:49 -08:00
[ appDelegate . storiesCollection markStory : [ request . userInfo objectForKey : @ "story" ] asSaved : NO ] ;
2013-08-05 17:29:42 -07:00
[ appDelegate . feedDetailViewController redrawUnreadStory ] ;
[ self refreshHeaders ] ;
2012-12-18 17:29:23 -08:00
[ self . currentPage flashCheckmarkHud : @ "unsaved" ] ;
2012-11-05 17:16:10 -08:00
}
2014-03-05 14:13:49 -08:00
- ( BOOL ) failedMarkAsUnsaved : ( ASIFormDataRequest * ) request {
if ( ! [ [ request . userInfo objectForKey : @ "story_hash" ]
isEqualToString : [ currentPage . activeStory objectForKey : @ "story_hash" ] ] ) {
return NO ;
2012-11-05 17:16:10 -08:00
}
2014-03-05 14:13:49 -08:00
[ self informError : @ "Failed to unsave story" ] ;
return YES ;
2012-11-05 17:16:10 -08:00
}
2014-03-05 14:13:49 -08:00
- ( BOOL ) failedMarkAsUnread : ( ASIFormDataRequest * ) request {
if ( ! [ [ request . userInfo objectForKey : @ "story_hash" ]
isEqualToString : [ currentPage . activeStory objectForKey : @ "story_hash" ] ] ) {
return NO ;
2013-10-03 18:07:39 -07:00
}
2013-10-04 12:37:51 -07:00
2014-03-05 14:13:49 -08:00
[ self informError : @ "Failed to unread story" ] ;
return YES ;
2013-10-03 18:07:39 -07:00
}
2012-11-05 17:16:10 -08:00
- ( IBAction ) showOriginalSubview : ( id ) sender {
2013-09-07 01:58:05 -05:00
[ appDelegate . masterContainerViewController hidePopover ] ;
2012-11-05 17:16:10 -08:00
NSURL * url = [ NSURL URLWithString : [ appDelegate . activeStory
objectForKey : @ "story_permalink" ] ] ;
[ appDelegate showOriginalStory : url ] ;
}
- ( IBAction ) tapProgressBar : ( id ) sender {
2014-09-18 15:15:41 -07:00
[ MBProgressHUD hideHUDForView : currentPage . webView animated : NO ] ;
MBProgressHUD * hud = [ MBProgressHUD showHUDAddedTo : currentPage . webView animated : YES ] ;
2012-11-05 17:16:10 -08:00
hud . mode = MBProgressHUDModeText ;
hud . removeFromSuperViewOnHide = YES ;
2013-09-25 17:43:00 -07:00
NSInteger unreadCount = appDelegate . unreadCount ;
2012-11-05 17:16:10 -08:00
if ( unreadCount = = 0 ) {
hud . labelText = @ "No unread stories" ;
} else if ( unreadCount = = 1 ) {
hud . labelText = @ "1 story left" ;
} else {
2013-09-25 17:43:00 -07:00
hud . labelText = [ NSString stringWithFormat : @ "%li stories left" , ( long ) unreadCount ] ;
2012-11-05 17:16:10 -08:00
}
[ hud hide : YES afterDelay : 0.8 ] ;
}
2012-11-28 16:24:15 -08:00
- ( void ) subscribeToBlurblog {
[ self . currentPage subscribeToBlurblog ] ;
}
2012-11-05 17:16:10 -08:00
2015-03-11 11:21:59 -07:00
- ( IBAction ) toggleTextView : ( id ) sender {
2013-10-08 13:57:15 -07:00
[ self endTouchDown : sender ] ;
2015-10-05 11:45:33 -07:00
NSString * feedIdStr = [ NSString stringWithFormat : @ "%@" ,
[ appDelegate . activeStory objectForKey : @ "story_feed_id" ] ] ;
[ appDelegate toggleFeedTextView : feedIdStr ] ;
2013-10-08 13:57:15 -07:00
2015-10-05 11:45:33 -07:00
[ self . currentPage showTextOrStoryView ] ;
[ self . nextPage showTextOrStoryView ] ;
[ self . previousPage showTextOrStoryView ] ;
2013-05-28 18:07:19 -07:00
}
2012-11-05 17:16:10 -08:00
# pragma mark -
# pragma mark Styles
2012-12-18 17:29:23 -08:00
- ( IBAction ) toggleFontSize : ( id ) sender {
2012-11-05 17:16:10 -08:00
if ( UI_USER _INTERFACE _IDIOM ( ) = = UIUserInterfaceIdiomPad ) {
2013-03-04 15:09:09 -08:00
[ appDelegate . masterContainerViewController showFontSettingsPopover : self . fontSettingsButton ] ;
2012-11-05 17:16:10 -08:00
} else {
if ( self . popoverController = = nil ) {
2014-11-04 12:15:49 -08:00
self . popoverController = [ [ WYPopoverController alloc ]
2012-11-05 17:16:10 -08:00
initWithContentViewController : appDelegate . fontSettingsViewController ] ;
self . popoverController . delegate = self ;
} else {
[ self . popoverController dismissPopoverAnimated : YES ] ;
self . popoverController = nil ;
}
2014-05-15 18:06:56 -07:00
[ self . popoverController setPopoverContentSize : CGSizeMake ( 240 , 38 * 8 -2 ) ] ;
2012-11-05 17:16:10 -08:00
[ self . popoverController presentPopoverFromBarButtonItem : self . fontSettingsButton
permittedArrowDirections : UIPopoverArrowDirectionAny
animated : YES ] ;
}
}
2012-11-09 14:13:44 -08:00
- ( void ) setFontStyle : ( NSString * ) fontStyle {
[ self . currentPage setFontStyle : fontStyle ] ;
[ self . nextPage setFontStyle : fontStyle ] ;
2012-11-14 17:31:52 -08:00
[ self . previousPage setFontStyle : fontStyle ] ;
2012-11-09 14:13:44 -08:00
}
- ( void ) changeFontSize : ( NSString * ) fontSize {
[ self . currentPage changeFontSize : fontSize ] ;
[ self . nextPage changeFontSize : fontSize ] ;
2012-11-14 17:31:52 -08:00
[ self . previousPage changeFontSize : fontSize ] ;
2012-11-09 14:13:44 -08:00
}
2014-05-15 18:06:56 -07:00
- ( void ) changeLineSpacing : ( NSString * ) lineSpacing {
[ self . currentPage changeLineSpacing : lineSpacing ] ;
[ self . nextPage changeLineSpacing : lineSpacing ] ;
[ self . previousPage changeLineSpacing : lineSpacing ] ;
}
2013-07-13 16:56:33 +02:00
# pragma mark -
# pragma mark HUDs
2012-11-09 14:13:44 -08:00
- ( void ) showShareHUD : ( NSString * ) msg {
// [ MBProgressHUD hideHUDForView : self . view animated : NO ] ;
2014-09-18 15:15:41 -07:00
self . storyHUD = [ MBProgressHUD showHUDAddedTo : currentPage . webView animated : YES ] ;
2012-11-09 14:13:44 -08:00
self . storyHUD . labelText = msg ;
self . storyHUD . margin = 20.0 f ;
2013-09-26 19:26:10 -07:00
self . currentPage . noStoryMessage . hidden = YES ;
2012-11-09 14:13:44 -08:00
}
2013-07-13 16:56:33 +02:00
- ( void ) flashCheckmarkHud : ( NSString * ) messageType {
[ [ self currentPage ] flashCheckmarkHud : messageType ] ;
}
2012-11-05 17:16:10 -08:00
# pragma mark -
# pragma mark Story Traversal
2013-10-08 13:57:15 -07:00
- ( IBAction ) doNextUnreadStory : ( id ) sender {
2012-11-06 17:26:08 -08:00
FeedDetailViewController * fdvc = self . appDelegate . feedDetailViewController ;
2014-02-12 20:09:37 -08:00
NSInteger nextLocation = [ appDelegate . storiesCollection locationOfNextUnreadStory ] ;
2013-09-25 17:43:00 -07:00
NSInteger unreadCount = [ appDelegate unreadCount ] ;
2014-04-18 14:48:38 -07:00
BOOL pageFinished = self . appDelegate . feedDetailViewController . pageFinished ;
2012-11-05 17:16:10 -08:00
[ self . loadingIndicator stopAnimating ] ;
2013-10-08 13:57:15 -07:00
[ self endTouchDown : sender ] ;
2012-12-13 17:25:52 -08:00
// NSLog ( @ "doNextUnreadStory: %d (out of %d)" , nextLocation , unreadCount ) ;
2012-12-13 16:41:52 -08:00
2014-04-18 14:48:38 -07:00
if ( nextLocation = = -1 && unreadCount > 0 && ! pageFinished &&
2014-02-27 14:49:33 -08:00
appDelegate . storiesCollection . feedPage < 100 ) {
2012-11-05 17:16:10 -08:00
[ self . loadingIndicator startAnimating ] ;
2013-04-23 11:52:34 -07:00
self . circularProgressView . hidden = YES ;
2012-11-06 17:26:08 -08:00
self . buttonNext . enabled = NO ;
// Fetch next page and see if it has the unreads .
2012-12-13 16:41:52 -08:00
self . waitingForNextUnreadFromServer = YES ;
[ fdvc fetchNextPage : nil ] ;
2012-11-06 13:45:15 -08:00
} else if ( nextLocation = = -1 ) {
2012-11-05 17:16:10 -08:00
[ appDelegate . navigationController
popToViewController : [ appDelegate . navigationController . viewControllers
objectAtIndex : 0 ]
animated : YES ] ;
[ appDelegate hideStoryDetailView ] ;
} else {
2012-11-06 13:45:15 -08:00
[ self changePage : nextLocation ] ;
2012-11-05 17:16:10 -08:00
}
}
2013-10-08 13:57:15 -07:00
- ( IBAction ) doPreviousStory : ( id ) sender {
[ self endTouchDown : sender ] ;
2012-11-05 17:16:10 -08:00
[ self . loadingIndicator stopAnimating ] ;
2013-04-23 11:52:34 -07:00
self . circularProgressView . hidden = NO ;
2014-02-12 20:09:37 -08:00
id previousStoryId = [ appDelegate . storiesCollection popReadStory ] ;
2014-02-12 20:41:29 -08:00
if ( ! previousStoryId || previousStoryId = = [ appDelegate . activeStory objectForKey : @ "story_hash" ] ) {
2012-11-05 17:16:10 -08:00
[ appDelegate . navigationController
popToViewController : [ appDelegate . navigationController . viewControllers
objectAtIndex : 0 ]
animated : YES ] ;
[ appDelegate hideStoryDetailView ] ;
} else {
2014-02-12 20:09:37 -08:00
NSInteger previousLocation = [ appDelegate . storiesCollection locationOfStoryId : previousStoryId ] ;
2012-11-06 13:45:15 -08:00
if ( previousLocation = = -1 ) {
2013-10-08 13:57:15 -07:00
return [ self doPreviousStory : sender ] ;
2012-11-05 17:16:10 -08:00
}
2012-11-05 18:23:45 -08:00
// [ appDelegate setActiveStory : [ [ appDelegate activeFeedStories ]
// objectAtIndex : previousIndex ] ] ;
// [ appDelegate changeActiveFeedDetailRow ] ;
//
2012-11-06 13:45:15 -08:00
[ self changePage : previousLocation ] ;
2012-11-05 17:16:10 -08:00
}
}
# pragma mark -
2014-11-04 12:15:49 -08:00
# pragma mark WYPopoverControllerDelegate implementation
2012-11-05 17:16:10 -08:00
2014-11-04 12:15:49 -08:00
- ( void ) popoverControllerDidDismissPopover : ( WYPopoverController * ) thePopoverController {
2012-11-05 17:16:10 -08:00
// Safe to release the popover here
self . popoverController = nil ;
}
2014-11-04 12:15:49 -08:00
- ( BOOL ) popoverControllerShouldDismissPopover : ( WYPopoverController * ) thePopoverController {
2012-11-05 17:16:10 -08:00
// The popover is automatically dismissed if you click outside it , unless you return NO here
return YES ;
}
2012-11-05 15:12:42 -08:00
@ end