diff --git a/media/ios/Classes/NewsBlurAppDelegate.m b/media/ios/Classes/NewsBlurAppDelegate.m index b1dc43e28..d84e27ec5 100644 --- a/media/ios/Classes/NewsBlurAppDelegate.m +++ b/media/ios/Classes/NewsBlurAppDelegate.m @@ -583,6 +583,7 @@ // change UIWebView [storyPageControl.currentPage changeWebViewWidth]; [storyPageControl.nextPage changeWebViewWidth]; + [storyPageControl.previousPage changeWebViewWidth]; } - (void)calibrateStoryTitles { diff --git a/media/ios/Classes/StoryDetailViewController.m b/media/ios/Classes/StoryDetailViewController.m index 158cf5bf2..b754f7a05 100644 --- a/media/ios/Classes/StoryDetailViewController.m +++ b/media/ios/Classes/StoryDetailViewController.m @@ -68,7 +68,7 @@ self.webView.scalesPageToFit = YES; self.webView.multipleTouchEnabled = NO; - self.pageIndex = -1; + self.pageIndex = -2; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @@ -113,6 +113,11 @@ } - (void)drawStory { + if (self.activeStoryId == [self.activeStory objectForKey:@"id"]) { + NSLog(@"Already drawn story. Ignoring."); +// return; + } + NSString *shareBarString = [self getShareBar]; NSString *commentString = [self getComments]; NSString *headerString; @@ -282,6 +287,8 @@ [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; + + self.activeStoryId = [self.activeStory objectForKey:@"id"]; } - (void)showStory { @@ -290,10 +297,12 @@ } - (void)clearStory { + self.activeStoryId = nil; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; } - (void)hideStory { + self.activeStoryId = nil; self.webView.hidden = YES; self.noStorySelectedLabel.hidden = NO; } @@ -745,7 +754,6 @@ } else { self.activeStory = appDelegate.activeStory; } - self.activeStoryId = [self.activeStory objectForKey:@"id"]; } - (BOOL)webView:(UIWebView *)webView diff --git a/media/ios/Classes/StoryPageControl.h b/media/ios/Classes/StoryPageControl.h index a247a3cb9..58bed7fed 100644 --- a/media/ios/Classes/StoryPageControl.h +++ b/media/ios/Classes/StoryPageControl.h @@ -37,6 +37,7 @@ @property (nonatomic) IBOutlet NewsBlurAppDelegate *appDelegate; @property (nonatomic) StoryDetailViewController *currentPage; @property (nonatomic) StoryDetailViewController *nextPage; +@property (nonatomic) StoryDetailViewController *previousPage; @property (nonatomic, strong) IBOutlet UIScrollView *scrollView; @property (nonatomic, strong) IBOutlet UIPageControl *pageControl; @@ -57,6 +58,7 @@ @property (readwrite) CGFloat inTouchMove; @property (assign) BOOL isDraggingScrollview; @property (nonatomic) MBProgressHUD *storyHUD; +@property (nonatomic) int scrollingToPage; @property (nonatomic, strong) WEPopoverController *popoverController; diff --git a/media/ios/Classes/StoryPageControl.m b/media/ios/Classes/StoryPageControl.m index e8dadc4d5..5b6bd16a4 100644 --- a/media/ios/Classes/StoryPageControl.m +++ b/media/ios/Classes/StoryPageControl.m @@ -27,7 +27,7 @@ @implementation StoryPageControl @synthesize appDelegate; -@synthesize currentPage, nextPage; +@synthesize currentPage, nextPage, previousPage; @synthesize progressView; @synthesize progressViewContainer; @synthesize toolbar; @@ -46,7 +46,7 @@ @synthesize inTouchMove; @synthesize isDraggingScrollview; @synthesize storyHUD; - +@synthesize scrollingToPage; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; @@ -59,12 +59,18 @@ - (void)viewDidLoad { currentPage = [[StoryDetailViewController alloc] initWithNibName:@"StoryDetailViewController" bundle:nil]; nextPage = [[StoryDetailViewController alloc] initWithNibName:@"StoryDetailViewController" bundle:nil]; + previousPage = [[StoryDetailViewController alloc] initWithNibName:@"StoryDetailViewController" bundle:nil]; + currentPage.appDelegate = appDelegate; nextPage.appDelegate = appDelegate; + previousPage.appDelegate = appDelegate; currentPage.view.frame = self.scrollView.frame; nextPage.view.frame = self.scrollView.frame; + previousPage.view.frame = self.scrollView.frame; + [self.scrollView addSubview:currentPage.view]; [self.scrollView addSubview:nextPage.view]; + [self.scrollView addSubview:previousPage.view]; [self.scrollView setPagingEnabled:YES]; [self.scrollView setScrollEnabled:YES]; [self.scrollView setShowsHorizontalScrollIndicator:NO]; @@ -137,6 +143,8 @@ [self setNextPreviousButtons]; [appDelegate adjustStoryDetailWebView]; + previousPage.view.hidden = YES; + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { if (!appDelegate.isSocialView) { UIImage *titleImage; @@ -188,6 +196,7 @@ // self.subscribeButton.tintColor = UIColorFromRGB(0x0a6720); } appDelegate.isTryFeedView = NO; + previousPage.view.hidden = NO; } - (void)transitionFromFeedDetail { @@ -200,24 +209,30 @@ } - (void)resetPages { + NSLog(@"resetPages"); [currentPage clearStory]; [nextPage clearStory]; +// [previousPage clearStory]; [currentPage hideStory]; [nextPage hideStory]; +// [previousPage hideStory]; - currentPage.pageIndex = -1; - nextPage.pageIndex = -1; + currentPage.pageIndex = -2; + nextPage.pageIndex = -2; + previousPage.pageIndex = -2; self.scrollView.contentOffset = CGPointMake(0, 0); } - (void)refreshPages { + NSLog(@"refreshPages"); [self resizeScrollView]; [appDelegate adjustStoryDetailWebView]; int pageIndex = currentPage.pageIndex; - currentPage.pageIndex = -1; - nextPage.pageIndex = -1; + currentPage.pageIndex = -2; + nextPage.pageIndex = -2; + previousPage.pageIndex = -2; [self changePage:pageIndex animated:NO]; [MBProgressHUD hideHUDForView:self.view animated:YES]; // self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width * currentPage.pageIndex, 0); @@ -263,23 +278,29 @@ #pragma mark - #pragma mark Side scroll view -- (void)applyNewIndex:(NSInteger)newIndex pageController:(StoryDetailViewController *)pageController -{ +- (void)applyNewIndex:(NSInteger)newIndex pageController:(StoryDetailViewController *)pageController { NSInteger pageCount = [[appDelegate activeFeedStoryLocations] count]; BOOL outOfBounds = newIndex >= pageCount || newIndex < 0; if (!outOfBounds) { +// NSLog(@"Apply index was: %d, now %d", pageController.pageIndex, newIndex); CGRect pageFrame = pageController.view.frame; pageFrame.origin.y = 0; pageFrame.origin.x = self.scrollView.frame.size.width * newIndex; + pageFrame.size.height = self.scrollView.frame.size.height; pageController.view.frame = pageFrame; } else { +// NSLog(@"Out of bounds: was %d, now %d", pageController.pageIndex, newIndex); CGRect pageFrame = pageController.view.frame; - pageFrame.origin.y = self.scrollView.frame.size.height / 2; + pageFrame.origin.x = self.scrollView.frame.size.width * newIndex; + pageFrame.origin.y = self.scrollView.frame.size.height; + pageFrame.size.height = 0; pageController.view.frame = pageFrame; } + int wasIndex = pageController.pageIndex; pageController.pageIndex = newIndex; + NSLog(@"Applied Index: Was %d, now %d (%d/%d/%d)", wasIndex, newIndex, previousPage.pageIndex, currentPage.pageIndex, nextPage.pageIndex); if (newIndex >= [appDelegate.activeFeedStoryLocations count]) { if (self.appDelegate.feedDetailViewController.feedPage < 50 && @@ -296,55 +317,71 @@ // animated:YES]; // [appDelegate hideStoryDetailView]; } - } else { + } else if (!outOfBounds) { int location = [appDelegate indexFromLocation:pageController.pageIndex]; [pageController setActiveStoryAtIndex:location]; - [pageController initStory]; - [pageController drawStory]; + [pageController clearStory]; + if (self.isDraggingScrollview || abs(newIndex - self.scrollingToPage) <= 1) { + [pageController initStory]; + [pageController drawStory]; + } else { + NSLog(@"Skipping drawing %d (waiting for %d)", newIndex, self.scrollingToPage); + } + } else if (outOfBounds) { + [pageController clearStory]; } [self resizeScrollView]; [self.loadingIndicator stopAnimating]; + + } -- (void)scrollViewDidScroll:(UIScrollView *)sender -{ +- (void)scrollViewDidScroll:(UIScrollView *)sender { [sender setContentOffset:CGPointMake(sender.contentOffset.x, 0)]; CGFloat pageWidth = self.scrollView.frame.size.width; float fractionalPage = self.scrollView.contentOffset.x / pageWidth; NSInteger lowerNumber = floor(fractionalPage); NSInteger upperNumber = lowerNumber + 1; + NSInteger previousNumber = lowerNumber - 1; - if (lowerNumber == currentPage.pageIndex) - { - if (upperNumber != nextPage.pageIndex) - { +// NSLog(@"Did Scroll: %f = %d (%d/%d/%d)", fractionalPage, lowerNumber, previousPage.pageIndex, currentPage.pageIndex, nextPage.pageIndex); + if (lowerNumber == currentPage.pageIndex) { + if (upperNumber != nextPage.pageIndex) { + NSLog(@"Next was %d, now %d (A)", nextPage.pageIndex, upperNumber); [self applyNewIndex:upperNumber pageController:nextPage]; } - } - else if (upperNumber == currentPage.pageIndex) - { - if (lowerNumber != nextPage.pageIndex) - { - [self applyNewIndex:lowerNumber pageController:nextPage]; + if (previousNumber != previousPage.pageIndex) { + NSLog(@"Prev was %d, now %d (A)", previousPage.pageIndex, previousNumber); + [self applyNewIndex:previousNumber pageController:previousPage]; } - } - else - { - if (lowerNumber == nextPage.pageIndex) - { - [self applyNewIndex:upperNumber pageController:currentPage]; + } else if (upperNumber == currentPage.pageIndex) { + // Going backwards + if (lowerNumber != previousPage.pageIndex) { + NSLog(@"Prev was %d, now %d (B)", previousPage.pageIndex, previousNumber); + [self applyNewIndex:lowerNumber pageController:previousPage]; } - else if (upperNumber == nextPage.pageIndex) - { + [self setStoryFromScroll]; + } else { + // Going forwards + if (lowerNumber == nextPage.pageIndex) { + NSLog(@"Prev was %d, now %d (C1)", previousPage.pageIndex, previousNumber); +// [self applyNewIndex:upperNumber pageController:nextPage]; +// [self applyNewIndex:lowerNumber pageController:currentPage]; + [self applyNewIndex:previousNumber pageController:previousPage]; + } else if (upperNumber == nextPage.pageIndex) { + NSLog(@"Prev was %d, now %d (C2)", previousPage.pageIndex, previousNumber); [self applyNewIndex:lowerNumber pageController:currentPage]; - } - else - { + [self applyNewIndex:previousNumber pageController:previousPage]; + } else { + NSLog(@"Next was %d, now %d (C3)", nextPage.pageIndex, upperNumber); + NSLog(@"Prev was %d, now %d (C3)", previousPage.pageIndex, previousNumber); [self applyNewIndex:lowerNumber pageController:currentPage]; [self applyNewIndex:upperNumber pageController:nextPage]; +// [self applyNewIndex:previousNumber pageController:previousPage]; } + [self setStoryFromScroll]; } } @@ -352,9 +389,18 @@ self.isDraggingScrollview = YES; } +- (void)scrollViewDidEndDecelerating:(UIScrollView *)newScrollView +{ + [self scrollViewDidEndScrollingAnimation:newScrollView]; +} + - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)newScrollView { self.isDraggingScrollview = NO; + CGFloat pageWidth = self.scrollView.frame.size.width; + float fractionalPage = self.scrollView.contentOffset.x / pageWidth; + NSInteger nearestNumber = lround(fractionalPage); + self.scrollingToPage = nearestNumber; [self setStoryFromScroll]; } @@ -370,12 +416,6 @@ } } - -- (void)scrollViewDidEndDecelerating:(UIScrollView *)newScrollView -{ - [self scrollViewDidEndScrollingAnimation:newScrollView]; -} - - (void)changePage:(NSInteger)pageIndex { [self changePage:pageIndex animated:YES]; } @@ -388,6 +428,8 @@ frame.origin.x = frame.size.width * pageIndex; frame.origin.y = 0; + self.scrollingToPage = pageIndex; + if (self.scrollView.contentOffset.x == frame.origin.x) { [self applyNewIndex:pageIndex pageController:currentPage]; [self setStoryFromScroll]; @@ -404,16 +446,27 @@ float fractionalPage = self.scrollView.contentOffset.x / pageWidth; NSInteger nearestNumber = lround(fractionalPage); - if (currentPage.pageIndex != nearestNumber) - { - StoryDetailViewController *swapController = currentPage; + if (currentPage.pageIndex < nearestNumber) { + NSLog(@"Swap next into current, current into previous: %d / %d", currentPage.pageIndex, nearestNumber); + StoryDetailViewController *swapCurrentController = currentPage; + StoryDetailViewController *swapPreviousController = previousPage; currentPage = nextPage; - nextPage = swapController; - } + previousPage = swapCurrentController; + nextPage = swapPreviousController; + } else if (currentPage.pageIndex > nearestNumber) { + NSLog(@"Swap previous into current: %d / %d", currentPage.pageIndex, nearestNumber); + StoryDetailViewController *swapCurrentController = currentPage; + StoryDetailViewController *swapNextController = nextPage; + currentPage = previousPage; + nextPage = swapCurrentController; + previousPage = swapNextController; + } + NSLog(@"Set Story from scroll: %f = %d (%d/%d/%d)", fractionalPage, nearestNumber, previousPage.pageIndex, currentPage.pageIndex, nextPage.pageIndex); if (currentPage.pageIndex == -1) return; nextPage.webView.scrollView.scrollsToTop = NO; + previousPage.webView.scrollView.scrollsToTop = NO; currentPage.webView.scrollView.scrollsToTop = YES; self.scrollView.scrollsToTop = NO; @@ -436,13 +489,18 @@ [self setNextPreviousButtons]; [appDelegate changeActiveFeedDetailRow]; - if (self.currentPage.pageIndex != location) { + NSLog(@"Updating Current: %d", location); [self applyNewIndex:location pageController:self.currentPage]; } if (self.nextPage.pageIndex != location+1) { + NSLog(@"Updating Next: %d", location+1); [self applyNewIndex:location+1 pageController:self.nextPage]; } + if (self.previousPage.pageIndex != location-1) { + NSLog(@"Updating Previous: %d", location-1); + [self applyNewIndex:location-1 pageController:self.previousPage]; + } } - (void)requestFailed:(ASIHTTPRequest *)request { @@ -765,11 +823,13 @@ - (void)setFontStyle:(NSString *)fontStyle { [self.currentPage setFontStyle:fontStyle]; [self.nextPage setFontStyle:fontStyle]; + [self.previousPage setFontStyle:fontStyle]; } - (void)changeFontSize:(NSString *)fontSize { [self.currentPage changeFontSize:fontSize]; [self.nextPage changeFontSize:fontSize]; + [self.previousPage changeFontSize:fontSize]; } - (void)showShareHUD:(NSString *)msg { @@ -779,6 +839,7 @@ self.storyHUD.margin = 20.0f; self.currentPage.noStorySelectedLabel.hidden = YES; self.nextPage.noStorySelectedLabel.hidden = YES; + self.previousPage.noStorySelectedLabel.hidden = YES; } #pragma mark - diff --git a/media/ios/NewsBlur.xcodeproj/project.pbxproj b/media/ios/NewsBlur.xcodeproj/project.pbxproj index 699a9bb68..376556698 100755 --- a/media/ios/NewsBlur.xcodeproj/project.pbxproj +++ b/media/ios/NewsBlur.xcodeproj/project.pbxproj @@ -1173,14 +1173,14 @@ 431B857415A1324200DCE497 /* Story */ = { isa = PBXGroup; children = ( + FF6A233016448E0700E15989 /* StoryPageControl.h */, + FF6A233116448E0700E15989 /* StoryPageControl.m */, 7842ECF511D44A530066CF9D /* StoryDetailViewController.h */, 7842ECF611D44A530066CF9D /* StoryDetailViewController.m */, 43763ACE158F90B100B3DBE2 /* FontSettingsViewController.h */, 43763ACF158F90B100B3DBE2 /* FontSettingsViewController.m */, 78095EC6128F30B500230C8E /* OriginalStoryViewController.h */, 78095EC7128F30B500230C8E /* OriginalStoryViewController.m */, - FF6A233016448E0700E15989 /* StoryPageControl.h */, - FF6A233116448E0700E15989 /* StoryPageControl.m */, ); name = Story; sourceTree = ""; diff --git a/media/ios/NewsBlur.xcodeproj/xcuserdata/sclay.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/media/ios/NewsBlur.xcodeproj/xcuserdata/sclay.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index d15ce98f3..b8f26d723 100644 --- a/media/ios/NewsBlur.xcodeproj/xcuserdata/sclay.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/media/ios/NewsBlur.xcodeproj/xcuserdata/sclay.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -2,47 +2,6 @@ - - - - - - - -