mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-08-05 16:58:59 +00:00
157 lines
4.6 KiB
Mathematica
157 lines
4.6 KiB
Mathematica
![]() |
//
|
||
|
// 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
|