Brion VIBBER has uploaded a new change for review. https://gerrit.wikimedia.org/r/150740
Change subject: Save scroll position across rotation better ...................................................................... Save scroll position across rotation better When rotating, we now check for the element that's at the top of the screen, estimate how far into it we were (by percentage of height), and return us to the recalculated position after rotating. Bug: 68683 Change-Id: Ibdd0f59bde682da46040fa3b0a5b8daab4822721 --- M wikipedia/View Controllers/WebView/WebViewController.m 1 file changed, 39 insertions(+), 20 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia refs/changes/40/150740/1 diff --git a/wikipedia/View Controllers/WebView/WebViewController.m b/wikipedia/View Controllers/WebView/WebViewController.m index 1ab10f4..bd48251 100644 --- a/wikipedia/View Controllers/WebView/WebViewController.m +++ b/wikipedia/View Controllers/WebView/WebViewController.m @@ -72,7 +72,7 @@ @property (nonatomic) BOOL unsafeToScroll; -@property (nonatomic) NSInteger indexOfFirstOnscreenSectionBeforeRotate; +@property (nonatomic) float relativeScrollOffsetBeforeRotate; @property (nonatomic) NSUInteger sectionToEditId; @property (strong, nonatomic) NSDictionary *adjacentHistoryIDs; @@ -142,8 +142,6 @@ self.zeroStatusLabel.text = @""; self.sectionToEditId = 0; - - self.indexOfFirstOnscreenSectionBeforeRotate = -1; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(webViewFinishedLoading) @@ -710,6 +708,15 @@ point.y += 2; + [self tocScrollWebViewToPoint:point + duration:duration + thenHideTOC:hideTOC]; +} + +-(void)tocScrollWebViewToPoint: (CGPoint)point + duration: (CGFloat)duration + thenHideTOC: (BOOL)hideTOC +{ [UIView animateWithDuration: duration delay: 0.0f options: UIViewAnimationOptionBeginFromCurrentState @@ -1763,14 +1770,17 @@ -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - NSManagedObjectID *articleID = [articleDataContext_.mainContext getArticleIDForTitle: [SessionSingleton sharedInstance].currentArticleTitle - domain: [SessionSingleton sharedInstance].currentArticleDomain]; - if (articleID) { - Article *article = (Article *)[articleDataContext_.mainContext objectWithID:articleID]; - - self.indexOfFirstOnscreenSectionBeforeRotate = [self.webView getIndexOfTopOnScreenElementWithPrefix:@"section_heading_and_content_block_" count:article.section.count]; - } - //self.view.alpha = 0.0f; + NSString *js = @"(function() {" + @" _topElement = document.elementFromPoint( window.innerWidth / 2, 0 );" + @" if (_topElement) {" + @" var rect = _topElement.getBoundingClientRect();" + @" return rect.top / rect.height;" + @" } else {" + @" return 0;" + @" }" + @"})()"; + float relativeScrollOffset = [[self.webView stringByEvaluatingJavaScriptFromString:js] floatValue]; + self.relativeScrollOffsetBeforeRotate = relativeScrollOffset; [self tocHideWithDuration:@0.0f]; @@ -1781,20 +1791,29 @@ { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; - [self performSelector:@selector(scrollToIndexOfFirstOnscreenSectionBeforeRotate) withObject:nil afterDelay:0.1f]; + [self scrollToElementOnScreenBeforeRotate]; [self updateWebViewContentAndScrollInsets]; } --(void)scrollToIndexOfFirstOnscreenSectionBeforeRotate{ - if(self.indexOfFirstOnscreenSectionBeforeRotate == -1)return; - NSString *elementId = [NSString stringWithFormat:@"section_heading_and_content_block_%ld", (long)self.indexOfFirstOnscreenSectionBeforeRotate]; - - [self tocScrollWebViewToSectionWithElementId: elementId - duration: 0.2 - thenHideTOC: NO]; +-(void)scrollToElementOnScreenBeforeRotate +{ + NSString *js = @"(function() {" + @" if (_topElement) {" + @" var rect = _topElement.getBoundingClientRect();" + @" return (window.scrollY + rect.top) - (%f * rect.height);" + @" } else {" + @" return 0;" + @" }" + @"})()"; + NSString *js2 = [NSString stringWithFormat:js, self.relativeScrollOffsetBeforeRotate, self.relativeScrollOffsetBeforeRotate]; + int finalScrollOffset = [[self.webView stringByEvaluatingJavaScriptFromString:js2] intValue]; - [self.tocVC centerCellForWebViewTopMostSectionAnimated:NO]; + CGPoint point = CGPointMake(0, finalScrollOffset); + + [self tocScrollWebViewToPoint:point + duration:0 + thenHideTOC:NO]; } #pragma mark Wikipedia Zero handling -- To view, visit https://gerrit.wikimedia.org/r/150740 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibdd0f59bde682da46040fa3b0a5b8daab4822721 Gerrit-PatchSet: 1 Gerrit-Project: apps/ios/wikipedia Gerrit-Branch: master Gerrit-Owner: Brion VIBBER <br...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits