Eureka, got a third 'previous' page in the mix for story page controls on iOS. This could be it. No bounce, no redraw, and flawless movement.

This commit is contained in:
Samuel Clay 2012-11-14 17:31:52 -08:00
parent e06310f070
commit 68d4d2786f
7 changed files with 125 additions and 94 deletions

View file

@ -583,6 +583,7 @@
// change UIWebView
[storyPageControl.currentPage changeWebViewWidth];
[storyPageControl.nextPage changeWebViewWidth];
[storyPageControl.previousPage changeWebViewWidth];
}
- (void)calibrateStoryTitles {

View file

@ -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

View file

@ -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;

View file

@ -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 -

View file

@ -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 = "<group>";

View file

@ -2,47 +2,6 @@
<Bucket
type = "1"
version = "1.0">
<FileBreakpoints>
<FileBreakpoint
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Classes/StoryPageControl.m"
timestampString = "374533637.198323"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "835"
endingLineNumber = "835"
landmarkName = "-doNextStory"
landmarkType = "5">
</FileBreakpoint>
<FileBreakpoint
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Other Sources/MBProgressHUD.m"
timestampString = "374190717.134082"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "105"
endingLineNumber = "105"
landmarkName = "+hideHUDForView:animated:"
landmarkType = "5">
</FileBreakpoint>
<FileBreakpoint
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Other Sources/MBProgressHUD.m"
timestampString = "374190721.59204"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "115"
endingLineNumber = "115"
landmarkName = "+hideAllHUDsForView:animated:"
landmarkType = "5">
</FileBreakpoint>
</FileBreakpoints>
<SymbolicBreakpoints>
<SymbolicBreakpoint
shouldBeEnabled = "Yes"

View file

@ -15,8 +15,8 @@
// #define BACKGROUND_REFRESH_SECONDS -5
#define BACKGROUND_REFRESH_SECONDS -10*60
// #define NEWSBLUR_URL [NSString stringWithFormat:@"nb.local.com"]
#define NEWSBLUR_URL [NSString stringWithFormat:@"www.newsblur.com"]
#define NEWSBLUR_URL [NSString stringWithFormat:@"nb.local.com"]
// #define NEWSBLUR_URL [NSString stringWithFormat:@"www.newsblur.com"]
#define NEWSBLUR_LINK_COLOR 0x405BA8
#define NEWSBLUR_HIGHLIGHT_COLOR 0xd2e6fd