NewsBlur/media/ios/Classes/StoryPageControl.m

157 lines
4.6 KiB
Mathematica
Raw Normal View History

//
// StoryPageControl.m
// NewsBlur
//
// Created by Samuel Clay on 11/2/12.
// Copyright (c) 2012 NewsBlur. All rights reserved.
//
#import "StoryPageControl.h"
#import "StoryDetailViewController.h"
#import "PagerViewController.h"
@implementation StoryPageControl
@synthesize appDelegate;
@synthesize currentPage, nextPage;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
currentPage = [[StoryDetailViewController alloc] initWithNibName:@"StoryDetailViewController" bundle:nil];
nextPage = [[StoryDetailViewController alloc] initWithNibName:@"StoryDetailViewController" bundle:nil];
currentPage.appDelegate = appDelegate;
nextPage.appDelegate = appDelegate;
[self.scrollView addSubview:currentPage.view];
[self.scrollView addSubview:nextPage.view];
[self.scrollView setPagingEnabled:YES];
[self.scrollView setScrollEnabled:YES];
[self.scrollView setShowsHorizontalScrollIndicator:NO];
[self.scrollView setShowsVerticalScrollIndicator:NO];
// [self.scrollView setDelegate:self];
}
- (void)viewWillAppear:(BOOL)animated {
NSInteger widthCount = self.appDelegate.originalStoryCount;
if (widthCount == 0) {
widthCount = 1;
}
currentPage.view.frame = self.scrollView.frame;
nextPage.view.frame = self.scrollView.frame;
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width
* widthCount,
self.scrollView.frame.size.height);
self.scrollView.contentOffset = CGPointMake(0, 0);
[self applyNewIndex:0 pageController:currentPage];
[self applyNewIndex:1 pageController:nextPage];
}
- (void)applyNewIndex:(NSInteger)newIndex pageController:(StoryDetailViewController *)pageController
{
NSInteger pageCount = appDelegate.originalStoryCount;
BOOL outOfBounds = newIndex >= pageCount || newIndex < 0;
if (!outOfBounds) {
CGRect pageFrame = pageController.view.frame;
pageFrame.origin.y = 0;
pageFrame.origin.x = self.scrollView.frame.size.width * newIndex;
pageController.view.frame = pageFrame;
} else {
CGRect pageFrame = pageController.view.frame;
pageFrame.origin.y = self.scrollView.frame.size.height;
pageController.view.frame = pageFrame;
}
pageController.pageIndex = newIndex;
appDelegate.activeStory = [[appDelegate activeFeedStories] objectAtIndex:pageController.pageIndex];
[pageController setActiveStory];
[pageController initStory];
}
- (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;
// NSLog(@"Scroll to %@", NSStringFromCGPoint(sender.contentOffset));
if (lowerNumber == currentPage.pageIndex)
{
if (upperNumber != nextPage.pageIndex)
{
[self applyNewIndex:upperNumber pageController:nextPage];
}
}
else if (upperNumber == currentPage.pageIndex)
{
if (lowerNumber != nextPage.pageIndex)
{
[self applyNewIndex:lowerNumber pageController:nextPage];
}
}
else
{
if (lowerNumber == nextPage.pageIndex)
{
[self applyNewIndex:upperNumber pageController:currentPage];
}
else if (upperNumber == nextPage.pageIndex)
{
[self applyNewIndex:lowerNumber pageController:currentPage];
}
else
{
[self applyNewIndex:lowerNumber pageController:currentPage];
[self applyNewIndex:upperNumber pageController:nextPage];
}
}
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)newScrollView
{
CGFloat pageWidth = self.scrollView.frame.size.width;
float fractionalPage = self.scrollView.contentOffset.x / pageWidth;
NSInteger nearestNumber = lround(fractionalPage);
if (currentPage.pageIndex != nearestNumber)
{
StoryDetailViewController *swapController = currentPage;
currentPage = nextPage;
nextPage = swapController;
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)newScrollView
{
[self scrollViewDidEndScrollingAnimation:newScrollView];
self.pageControl.currentPage = currentPage.pageIndex;
}
- (IBAction)changePage:(id)sender
{
NSInteger pageIndex = self.pageControl.currentPage;
// update the scroll view to the appropriate page
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * pageIndex;
frame.origin.y = 0;
[self.scrollView scrollRectToVisible:frame animated:YES];
}
@end