iOS: done #1100 (scroll vertically between stories)

Added a new "Scroll horizontally" preference (in the "Reading Stories" section of the prefs).  Defaults off.  Note that this is a change in behavior from before; you might want to default it on to avoid confusing existing users.  I do prefer the new vertical scrolling behavior.
This commit is contained in:
David Sinclair 2018-08-30 16:33:42 -07:00
parent 8db922e20b
commit 3ce5f1dc5a
12 changed files with 157 additions and 40 deletions

View file

@ -80,6 +80,7 @@
self.webView.scalesPageToFit = YES;
// self.webView.multipleTouchEnabled = NO;
[self.webView.scrollView setAlwaysBounceVertical:appDelegate.storyPageControl.isHorizontal];
[self.webView.scrollView setDelaysContentTouches:NO];
[self.webView.scrollView setDecelerationRate:UIScrollViewDecelerationRateNormal];
[self.webView.scrollView setAutoresizesSubviews:(UIViewAutoresizingFlexibleWidth |
@ -1286,10 +1287,10 @@
} completion:^(BOOL finished) {
}];
} else if (singlePage) {
} else if (singlePage || !appDelegate.storyPageControl.isHorizontal) {
appDelegate.storyPageControl.traverseView.alpha = 1;
NSLog(@" ---> Bottom position: %d", bottomPosition);
if (bottomPosition >= 0) {
if (bottomPosition >= 0 || !appDelegate.storyPageControl.isHorizontal) {
// appDelegate.storyPageControl.traverseView.frame = CGRectMake(tvf.origin.x,
// self.webView.scrollView.frame.size.height - tvf.size.height - safeBottomMargin,
// tvf.size.width, tvf.size.height);

View file

@ -75,6 +75,7 @@
@property (nonatomic) MBProgressHUD *storyHUD;
@property (nonatomic, strong) NBNotifier *notifier;
@property (nonatomic) NSInteger scrollingToPage;
@property (nonatomic, readonly) BOOL isHorizontal;
- (void)resizeScrollView;
- (void)applyNewIndex:(NSInteger)newIndex pageController:(StoryDetailViewController *)pageController;

View file

@ -95,6 +95,8 @@
[self.scrollView setScrollEnabled:YES];
[self.scrollView setShowsHorizontalScrollIndicator:NO];
[self.scrollView setShowsVerticalScrollIndicator:NO];
[self.scrollView setAlwaysBounceHorizontal:self.isHorizontal];
[self.scrollView setAlwaysBounceVertical:!self.isHorizontal];
// NSLog(@"Scroll view frame post: %@", NSStringFromCGRect(self.scrollView.frame));
// NSLog(@"Scroll view parent: %@", NSStringFromCGRect(currentPage.view.frame));
[self.scrollView sizeToFit];
@ -468,6 +470,10 @@
[self performSelector:@selector(unhighlightButton:) withObject:sender afterDelay:0.2];
}
- (BOOL)isHorizontal {
return [[[NSUserDefaults standardUserDefaults] objectForKey:@"scroll_stories_horizontally"] boolValue];
}
- (void)resetPages {
self.navigationItem.titleView = nil;
@ -520,8 +526,15 @@
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
frame = self.scrollView.bounds;
}
frame.origin.x = frame.size.width * currentIndex;
frame.origin.y = 0;
if (self.isHorizontal) {
frame.origin.x = frame.size.width * currentIndex;
frame.origin.y = 0;
} else {
frame.origin.x = 0;
frame.origin.y = frame.size.height * currentIndex;
}
[self.scrollView scrollRectToVisible:frame animated:NO];
// NSLog(@"---> Scrolling to story at: %@ %d-%d", NSStringFromCGRect(frame), currentPage.pageIndex, currentIndex);
[MBProgressHUD hideHUDForView:self.view animated:YES];
@ -546,13 +559,20 @@
}
- (void)resizeScrollView {
NSInteger widthCount = appDelegate.storiesCollection.storyLocationsCount;
if (widthCount == 0) {
widthCount = 1;
NSInteger storyCount = appDelegate.storiesCollection.storyLocationsCount;
if (storyCount == 0) {
storyCount = 1;
}
self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width
* widthCount,
self.scrollView.bounds.size.height);
if (self.isHorizontal) {
self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width
* storyCount,
self.scrollView.bounds.size.height);
} else {
self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width,
self.scrollView.bounds.size.height
* storyCount);
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
@ -628,27 +648,37 @@
if (!outOfBounds) {
CGRect pageFrame = pageController.view.bounds;
pageFrame.origin.y = 0;
pageFrame.origin.x = CGRectGetWidth(self.scrollView.bounds) * newIndex;
if (self.isHorizontal) {
pageFrame.origin.y = 0;
pageFrame.origin.x = CGRectGetWidth(self.scrollView.bounds) * newIndex;
} else {
pageFrame.origin.y = CGRectGetHeight(self.scrollView.bounds) * newIndex;
pageFrame.origin.x = 0;
}
pageFrame.size.height = CGRectGetHeight(self.scrollView.bounds);
pageFrame.size.width = CGRectGetWidth(self.scrollView.bounds);
pageController.view.hidden = NO;
pageController.view.frame = pageFrame;
} else {
// NSLog(@"Out of bounds: was %d, now %d", pageController.pageIndex, newIndex);
// NSLog(@"Out of bounds: was %@, now %@", @(pageController.pageIndex), @(newIndex));
CGRect pageFrame = pageController.view.bounds;
pageFrame.origin.x = CGRectGetWidth(self.scrollView.bounds) * newIndex;
pageFrame.origin.y = CGRectGetHeight(self.scrollView.bounds);
if (self.isHorizontal) {
pageFrame.origin.x = CGRectGetWidth(self.scrollView.bounds) * newIndex;
pageFrame.origin.y = CGRectGetHeight(self.scrollView.bounds);
} else {
pageFrame.origin.x = 0;
pageFrame.origin.y = CGRectGetHeight(self.scrollView.bounds) * newIndex;
}
pageFrame.size.height = CGRectGetHeight(self.scrollView.bounds);
pageFrame.size.width = CGRectGetWidth(self.scrollView.bounds);
pageController.view.hidden = YES;
pageController.view.frame = pageFrame;
}
// NSLog(@"---> Story page control orient page: %@ (%d-%d)", NSStringFromCGRect(self.scrollView.bounds), pageController.pageIndex, suppressRedraw);
// NSLog(@"---> Story page control orient page: %@ (%@-%@)", NSStringFromCGRect(self.scrollView.bounds), @(pageController.pageIndex), suppressRedraw ? @"supress" : @"redraw");
if (suppressRedraw) return;
// NSInteger wasIndex = pageController.pageIndex;
NSInteger wasIndex = pageController.pageIndex;
pageController.pageIndex = newIndex;
// 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));
@ -658,7 +688,7 @@
!appDelegate.feedDetailViewController.pageFinished &&
!appDelegate.feedDetailViewController.pageFetching) {
[appDelegate.feedDetailViewController fetchNextPage:^() {
// NSLog(@"Fetched next page, %d stories", [appDelegate.activeFeedStoryLocations count]);
// NSLog(@"Fetched next page, %@ stories", @([appDelegate.storiesCollection.activeFeedStoryLocations count]));
[self applyNewIndex:newIndex pageController:pageController];
}];
} else if (!appDelegate.feedDetailViewController.pageFinished &&
@ -681,7 +711,7 @@
__block StoryDetailViewController *blockPageController = pageController;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul), ^{
if (blockPageController.activeStoryId && ![blockPageController.activeStoryId isEqualToString:originalStoryId]) {
NSLog(@"Stale story, already drawn. Was: %@, Now: %@", originalStoryId, blockPageController.activeStoryId);
// NSLog(@"Stale story, already drawn. Was: %@, Now: %@", originalStoryId, blockPageController.activeStoryId);
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
@ -709,8 +739,10 @@
- (void)scrollViewDidScroll:(UIScrollView *)sender {
// [sender setContentOffset:CGPointMake(sender.contentOffset.x, 0)];
if (inRotation) return;
CGFloat pageWidth = self.scrollView.frame.size.width;
float fractionalPage = self.scrollView.contentOffset.x / pageWidth;
CGSize size = self.scrollView.frame.size;
CGPoint offset = self.scrollView.contentOffset;
CGFloat pageAmount = self.isHorizontal ? size.width : size.height;
float fractionalPage = (self.isHorizontal ? offset.x : offset.y) / pageAmount;
NSInteger lowerNumber = floor(fractionalPage);
NSInteger upperNumber = lowerNumber + 1;
@ -719,7 +751,7 @@
NSInteger storyCount = [appDelegate.storiesCollection.activeFeedStoryLocations count];
if (storyCount == 0 || lowerNumber > storyCount) return;
// NSLog(@"Did Scroll: %f = %d (%d/%d/%d)", fractionalPage, lowerNumber, previousPage.pageIndex, currentPage.pageIndex, nextPage.pageIndex);
// NSLog(@"Did Scroll: %@ = %@ (%@/%@/%@)", @(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);
@ -795,8 +827,10 @@
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)newScrollView
{
self.isDraggingScrollview = NO;
CGFloat pageWidth = self.scrollView.frame.size.width;
float fractionalPage = self.scrollView.contentOffset.x / pageWidth;
CGSize size = self.scrollView.frame.size;
CGPoint offset = self.scrollView.contentOffset;
CGFloat pageAmount = self.isHorizontal ? size.width : size.height;
float fractionalPage = (self.isHorizontal ? offset.x : offset.y) / pageAmount;
NSInteger nearestNumber = lround(fractionalPage);
self.scrollingToPage = nearestNumber;
[self setStoryFromScroll];
@ -809,12 +843,16 @@
if (!self.isPhoneOrCompact &&
[keyPath isEqual:@"contentOffset"] &&
self.isDraggingScrollview) {
CGFloat pageWidth = self.scrollView.frame.size.width;
float fractionalPage = self.scrollView.contentOffset.x / pageWidth;
CGSize size = self.scrollView.frame.size;
CGPoint offset = self.scrollView.contentOffset;
CGFloat pageAmount = self.isHorizontal ? size.width : size.height;
float fractionalPage = (self.isHorizontal ? offset.x : offset.y) / pageAmount;
NSInteger nearestNumber = lround(fractionalPage);
if (![appDelegate.storiesCollection.activeFeedStories count]) return;
// NSLog(@"observe content offset: fractional page %@", @(fractionalPage)); // log
NSInteger storyIndex = [appDelegate.storiesCollection indexFromLocation:nearestNumber];
if (storyIndex != [appDelegate.storiesCollection indexOfActiveStory] && storyIndex != NSNotFound) {
appDelegate.activeStory = [appDelegate.storiesCollection.activeFeedStories
@ -829,14 +867,25 @@
if (!self.isPhoneOrCompact &&
!self.isAnimatedIntoPlace) {
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width;
if (self.isHorizontal) {
frame.origin.x = frame.size.width;
} else {
frame.origin.y = frame.size.height;
}
self.scrollView.frame = frame;
[UIView animateWithDuration:(animated ? .22 : 0) delay:0
options:UIViewAnimationOptionCurveEaseInOut
animations:^
{
CGRect frame = self.scrollView.frame;
frame.origin.x = 0;
if (self.isHorizontal) {
frame.origin.x = 0;
} else {
frame.origin.y = 0;
}
self.scrollView.frame = frame;
} completion:^(BOOL finished) {
self.isAnimatedIntoPlace = YES;
@ -849,12 +898,20 @@
}
- (void)changePage:(NSInteger)pageIndex animated:(BOOL)animated {
// NSLog(@"changePage to %d (animated: %d)", pageIndex, animated);
// NSLog(@"changePage to %@ (%@animated)", @(pageIndex), animated ? @"" : @"not ");
// update the scroll view to the appropriate page
[self resizeScrollView];
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * pageIndex;
frame.origin.y = 0;
CGPoint offset = self.scrollView.contentOffset;
if (self.isHorizontal) {
frame.origin.x = frame.size.width * pageIndex;
frame.origin.y = 0;
} else {
frame.origin.x = 0;
frame.origin.y = frame.size.height * pageIndex;
}
self.scrollingToPage = pageIndex;
[self.currentPage hideNoStoryMessage];
@ -862,7 +919,7 @@
[self.previousPage hideNoStoryMessage];
// Check if already on the selected page
if (self.scrollView.contentOffset.x == frame.origin.x) {
if (self.isHorizontal ? offset.x == frame.origin.x : offset.y == frame.origin.y) {
[self applyNewIndex:pageIndex pageController:currentPage];
[self setStoryFromScroll];
} else {
@ -899,26 +956,30 @@
}
- (void)setStoryFromScroll:(BOOL)force {
CGFloat pageWidth = self.scrollView.bounds.size.width;
float fractionalPage = self.scrollView.contentOffset.x / pageWidth;
CGSize size = self.scrollView.bounds.size;
CGPoint offset = self.scrollView.contentOffset;
CGFloat pageAmount = self.isHorizontal ? size.width : size.height;
float fractionalPage = (self.isHorizontal ? offset.x : offset.y) / pageAmount;
NSInteger nearestNumber = lround(fractionalPage);
// NSLog(@"setStoryFromScroll: fractional page %@", @(fractionalPage)); // log
if (!force && currentPage.pageIndex >= 0 &&
currentPage.pageIndex == nearestNumber &&
currentPage.pageIndex != self.scrollingToPage) {
// NSLog(@"Skipping setStoryFromScroll: currentPage is %d (%d, %d)", currentPage.pageIndex, nearestNumber, self.scrollingToPage);
// NSLog(@"Skipping setStoryFromScroll: currentPage is %@ (%@, %@)", @(currentPage.pageIndex), @(nearestNumber), @(self.scrollingToPage));
return;
}
if (currentPage.pageIndex < nearestNumber) {
// NSLog(@"Swap next into current, current into previous: %d / %d", currentPage.pageIndex, nearestNumber);
// NSLog(@"Swap next into current, current into previous: %@ / %@", @(currentPage.pageIndex), @(nearestNumber));
StoryDetailViewController *swapCurrentController = currentPage;
StoryDetailViewController *swapPreviousController = previousPage;
currentPage = nextPage;
previousPage = swapCurrentController;
nextPage = swapPreviousController;
} else if (currentPage.pageIndex > nearestNumber) {
// NSLog(@"Swap previous into current: %d / %d", currentPage.pageIndex, nearestNumber);
// NSLog(@"Swap previous into current: %@ / %@", @(currentPage.pageIndex), @(nearestNumber));
StoryDetailViewController *swapCurrentController = currentPage;
StoryDetailViewController *swapNextController = nextPage;
currentPage = previousPage;
@ -926,7 +987,7 @@
previousPage = swapNextController;
}
// NSLog(@"Set Story from scroll: %f = %d (%d/%d/%d)", fractionalPage, nearestNumber, previousPage.pageIndex, currentPage.pageIndex, nextPage.pageIndex);
// NSLog(@"Set Story from scroll: %@ = %@ (%@/%@/%@)", @(fractionalPage), @(nearestNumber), @(previousPage.pageIndex), @(currentPage.pageIndex), @(nextPage.pageIndex));
nextPage.webView.scrollView.scrollsToTop = NO;
previousPage.webView.scrollView.scrollsToTop = NO;
@ -941,6 +1002,11 @@
if (currentPage.pageIndex == -2) return;
self.scrollingToPage = -1;
NSInteger storyIndex = [appDelegate.storiesCollection indexFromLocation:currentPage.pageIndex];
if (storyIndex < 0) {
NSLog(@"invalid story index: %@ for page index: %@", @(storyIndex), @(currentPage.pageIndex)); // log
}
appDelegate.activeStory = [appDelegate.storiesCollection.activeFeedStories objectAtIndex:storyIndex];
[self updatePageWithActiveStory:currentPage.pageIndex];
if ([appDelegate.storiesCollection isStoryUnread:appDelegate.activeStory]) {
@ -1024,8 +1090,12 @@
[buttonPrevious setEnabled:YES];
}
[buttonPrevious setBackgroundImage:[[ThemeManager themeManager] themedImage:[UIImage imageNamed:@"traverse_previous.png"]]
NSString *previousName = self.isHorizontal ? @"traverse_previous.png" : @"traverse_previous_vert.png";
NSString *previousNameOff = self.isHorizontal ? @"traverse_previous_off.png" : @"traverse_previous_off_vert.png";
[buttonPrevious setBackgroundImage:[[ThemeManager themeManager] themedImage:[UIImage imageNamed:previousName]]
forState:UIControlStateNormal];
[buttonPrevious setBackgroundImage:[[ThemeManager themeManager] themedImage:[UIImage imageNamed:previousNameOff]]
forState:UIControlStateDisabled];
// setting up the NEXT UNREAD STORY BUTTON
buttonNext.enabled = YES;
@ -1034,8 +1104,9 @@
BOOL pageFinished = appDelegate.feedDetailViewController.pageFinished;
if ((nextIndex == -1 && unreadCount > 0 && !pageFinished) ||
nextIndex != -1) {
NSString *nextName = self.isHorizontal ? @"traverse_next.png" : @"traverse_next_vert.png";
[buttonNext setTitle:[@"Next" uppercaseString] forState:UIControlStateNormal];
[buttonNext setBackgroundImage:[[ThemeManager themeManager] themedImage:[UIImage imageNamed:@"traverse_next.png"]]
[buttonNext setBackgroundImage:[[ThemeManager themeManager] themedImage:[UIImage imageNamed:nextName]]
forState:UIControlStateNormal];
} else {
[buttonNext setTitle:[@"Done" uppercaseString] forState:UIControlStateNormal];

View file

@ -68,6 +68,12 @@
17C5BA701CA39EA400F5961C /* unread_yellow_icn@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C5BA6A1CA39EA400F5961C /* unread_yellow_icn@3x.png */; };
17C5BA731CA39EE400F5961C /* unread_blue_icn.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C5BA711CA39EE400F5961C /* unread_blue_icn.png */; };
17C5BA741CA39EE400F5961C /* unread_blue_icn@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C5BA721CA39EE400F5961C /* unread_blue_icn@2x.png */; };
17C67D9E2138B2D20027CCAE /* traverse_previous_off_vert@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C67D982138B2CF0027CCAE /* traverse_previous_off_vert@2x.png */; };
17C67D9F2138B2D20027CCAE /* traverse_previous_vert@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C67D992138B2D00027CCAE /* traverse_previous_vert@2x.png */; };
17C67DA02138B2D20027CCAE /* traverse_next_vert@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C67D9A2138B2D00027CCAE /* traverse_next_vert@2x.png */; };
17C67DA12138B2D20027CCAE /* traverse_previous_vert.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C67D9B2138B2D10027CCAE /* traverse_previous_vert.png */; };
17C67DA22138B2D20027CCAE /* traverse_previous_off_vert.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C67D9C2138B2D10027CCAE /* traverse_previous_off_vert.png */; };
17C67DA32138B2D20027CCAE /* traverse_next_vert.png in Resources */ = {isa = PBXBuildFile; fileRef = 17C67D9D2138B2D10027CCAE /* traverse_next_vert.png */; };
17CBD3BC1BF66B07003FCCAE /* MarkReadMenuViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17CBD3BB1BF66B07003FCCAE /* MarkReadMenuViewController.xib */; };
17CBD3BF1BF66B6C003FCCAE /* MarkReadMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17CBD3BE1BF66B6C003FCCAE /* MarkReadMenuViewController.m */; };
17CBD3C21BF6ED2C003FCCAE /* menu_icn_markread.png in Resources */ = {isa = PBXBuildFile; fileRef = 17CBD3C01BF6ED2C003FCCAE /* menu_icn_markread.png */; };
@ -691,6 +697,12 @@
17C5BA6A1CA39EA400F5961C /* unread_yellow_icn@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "unread_yellow_icn@3x.png"; sourceTree = "<group>"; };
17C5BA711CA39EE400F5961C /* unread_blue_icn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = unread_blue_icn.png; sourceTree = "<group>"; };
17C5BA721CA39EE400F5961C /* unread_blue_icn@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "unread_blue_icn@2x.png"; sourceTree = "<group>"; };
17C67D982138B2CF0027CCAE /* traverse_previous_off_vert@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "traverse_previous_off_vert@2x.png"; sourceTree = "<group>"; };
17C67D992138B2D00027CCAE /* traverse_previous_vert@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "traverse_previous_vert@2x.png"; sourceTree = "<group>"; };
17C67D9A2138B2D00027CCAE /* traverse_next_vert@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "traverse_next_vert@2x.png"; sourceTree = "<group>"; };
17C67D9B2138B2D10027CCAE /* traverse_previous_vert.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = traverse_previous_vert.png; sourceTree = "<group>"; };
17C67D9C2138B2D10027CCAE /* traverse_previous_off_vert.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = traverse_previous_off_vert.png; sourceTree = "<group>"; };
17C67D9D2138B2D10027CCAE /* traverse_next_vert.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = traverse_next_vert.png; sourceTree = "<group>"; };
17CBD3BB1BF66B07003FCCAE /* MarkReadMenuViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MarkReadMenuViewController.xib; sourceTree = "<group>"; };
17CBD3BD1BF66B6C003FCCAE /* MarkReadMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkReadMenuViewController.h; sourceTree = "<group>"; };
17CBD3BE1BF66B6C003FCCAE /* MarkReadMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MarkReadMenuViewController.m; sourceTree = "<group>"; };
@ -1878,10 +1890,16 @@
FF688E4D16E6B3E1003B7B42 /* traverse_done@2x.png */,
FF5D4019179A03E700349659 /* traverse_previous_off.png */,
FF5D401A179A03E700349659 /* traverse_previous_off@2x.png */,
17C67D9C2138B2D10027CCAE /* traverse_previous_off_vert.png */,
17C67D982138B2CF0027CCAE /* traverse_previous_off_vert@2x.png */,
FF688E4816E6AFD3003B7B42 /* traverse_previous.png */,
FF688E4916E6AFD3003B7B42 /* traverse_previous@2x.png */,
17C67D9B2138B2D10027CCAE /* traverse_previous_vert.png */,
17C67D992138B2D00027CCAE /* traverse_previous_vert@2x.png */,
FF688E4416E6ADB1003B7B42 /* traverse_next.png */,
FF688E4516E6ADB1003B7B42 /* traverse_next@2x.png */,
17C67D9D2138B2D10027CCAE /* traverse_next_vert.png */,
17C67D9A2138B2D00027CCAE /* traverse_next_vert@2x.png */,
FF22FE7416E557D80046165A /* toolbar_tall_background.png */,
FF22FE7516E557D80046165A /* toolbar_tall_background@2x.png */,
FF22FE7016E554FD0046165A /* barbutton_sendto.png */,
@ -2844,6 +2862,7 @@
43A4C49A15B00A26008787B5 /* warning.gif in Resources */,
43A4C49B15B00A26008787B5 /* warning.png in Resources */,
17E265DE1C0D17340060655F /* storyDetailViewDark.css in Resources */,
17C67D9F2138B2D20027CCAE /* traverse_previous_vert@2x.png in Resources */,
43A4C49C15B00A26008787B5 /* world.png in Resources */,
43C1680B15B3D99B00428BA3 /* 7-location-place.png in Resources */,
43B6A27515B6952F00CEA2E6 /* group.png in Resources */,
@ -2864,6 +2883,7 @@
43A4BADE15C866FA00F3B8D4 /* popoverArrowLeft.png in Resources */,
FFC486AC19CA410000F4758F /* logo_50.png in Resources */,
176129601C630AEB00702FE4 /* mute_feed_off.png in Resources */,
17C67DA12138B2D20027CCAE /* traverse_previous_vert.png in Resources */,
FFB9BE4817F4B65B00FE0A36 /* logo_152.png in Resources */,
43A4BADF15C866FA00F3B8D4 /* popoverArrowLeft@2x.png in Resources */,
1750658F1C5730FB00072BF5 /* barbutton_selection_off.png in Resources */,
@ -2924,6 +2944,7 @@
FF03B00219F881380063002A /* ARChromeActivity@3x~ipad.png in Resources */,
17C5BA6E1CA39EA400F5961C /* unread_yellow_icn.png in Resources */,
FF5F3A82162B82B5008DBE3E /* rainbow.png in Resources */,
17C67DA22138B2D20027CCAE /* traverse_previous_off_vert.png in Resources */,
FF5F3A85162B831A008DBE3E /* user_orange.png in Resources */,
1740C69F1C1110BA005EA453 /* theme_color_light-sel@2x.png in Resources */,
FF5F3A87162B834E008DBE3E /* bin_closed.png in Resources */,
@ -2992,6 +3013,7 @@
FFC5F31116E2D2C2007AC72C /* story_share_facebook.png in Resources */,
FFC5F31216E2D2C2007AC72C /* story_share_facebook@2x.png in Resources */,
FF03AFE519F87A770063002A /* g_icn_folder_read@2x.png in Resources */,
17C67D9E2138B2D20027CCAE /* traverse_previous_off_vert@2x.png in Resources */,
FF6281FA1A09614C00271FDB /* all@3x.png in Resources */,
FFC5F31316E2D2C2007AC72C /* story_share_twitter_active.png in Resources */,
FFC5F31416E2D2C2007AC72C /* story_share_twitter_active@2x.png in Resources */,
@ -3087,6 +3109,7 @@
1740C6881C10FD75005EA453 /* theme_color_dark.png in Resources */,
FFDD848016E887D3000AA0A2 /* g_icn_hidden.png in Resources */,
FF21B11C1C8228740053938A /* disclosure_border_medium.png in Resources */,
17C67DA02138B2D20027CCAE /* traverse_next_vert@2x.png in Resources */,
FFDD848116E887D3000AA0A2 /* g_icn_hidden@2x.png in Resources */,
FFB7050C1925921F0052101C /* line_spacing_s.png in Resources */,
1740C69E1C1110BA005EA453 /* theme_color_light-sel.png in Resources */,
@ -3098,6 +3121,7 @@
17C5BA6B1CA39EA400F5961C /* unread_green_icn.png in Resources */,
1740C6A01C1110BA005EA453 /* theme_color_medium-sel.png in Resources */,
FFDD848A16E8EBF8000AA0A2 /* train.png in Resources */,
17C67DA32138B2D20027CCAE /* traverse_next_vert.png in Resources */,
FFDD848B16E8EBF8000AA0A2 /* train@2x.png in Resources */,
FFB9BE4A17F4B65B00FE0A36 /* logo_40.png in Resources */,
FFDD848E16E8ED75000AA0A2 /* menu_icn_share.png in Resources */,

View file

@ -624,6 +624,16 @@
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Scroll horizontally</string>
<key>Key</key>
<string>scroll_stories_horizontally</string>
<key>DefaultValue</key>
<false/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>

View file

@ -644,6 +644,16 @@
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Scroll horizontally</string>
<key>Key</key>
<string>scroll_stories_horizontally</string>
<key>DefaultValue</key>
<false/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB