[iOS]通过UIScrollView和UIPageControl实现滑动切换的效果
2014-07-15 12:04
1121 查看
UIPageControl是自带的控件,可以查看官方文档,下载官方示例学习。
如果对Xcode自带的文档不熟悉可以参见:苹果Xcode帮助文档阅读指南
接下来是我学习笔记,使用Storyboard实现滑动切换的效果。
-----------------------------------------------------------------------------
新建一个项目,拖上一个UIScrollView和UIPageControl,并且建立关联:
新建一个ContentViewController,作为页面切换的内容视图:
也就是说,当滑动屏幕切换的时候,其实就是多个ContentViewController在切换。
基本结构是:
在主页面,我们首先初始化一些设置:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 初始化page control的内容
_contentList = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil];
// 一共有多少页
NSUInteger numberPages = self.contentList.count;
// 存储所有的controller
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (NSUInteger i = 0; i < numberPages; i++)
{
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
// 一个页面的宽度就是scrollview的宽度
self.myScrollView.pagingEnabled = YES; // 自动滚动到subview的边界
self.myScrollView.contentSize =
CGSizeMake(CGRectGetWidth(self.myScrollView.frame) * numberPages, CGRectGetHeight(self.myScrollView.frame));
self.myScrollView.showsHorizontalScrollIndicator = NO;
self.myScrollView.showsVerticalScrollIndicator = NO;
self.myScrollView.scrollsToTop = NO;
self.myScrollView.delegate = self;
_numberOfPages = numberPages;
_myPageControl.numberOfPages = numberPages;
_currentPage = 0;
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
接下来,我们需要一个函数,来加载ContentView页面上的元素:
// 加载ScrollView中的不同SubViewController
- (void)loadScrollViewWithPage:(NSUInteger)page
{
if (page >= self.contentList.count)
return;
// replace the placeholder if necessary
LContentViewController *controller = [self.viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
controller = [[LContentViewController alloc] init];
[self.viewControllers replaceObjectAtIndex:page withObject:controller];
}
// add the controller's view to the scroll view
if (controller.view.superview == nil)
{
CGRect frame = self.myScrollView.frame;
frame.origin.x = CGRectGetWidth(frame) * page;
frame.origin.y = 0;
controller.view.frame = frame;
[controller setLabel:[_contentList objectAtIndex:page]];
[self.myScrollView addSubview:controller.view];
}
}
然后先来处理一下PageControl的切换事件:- (void)gotoPage:(BOOL)animated
{
NSInteger page = self.myPageControl.currentPage;
// load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
// update the scroll view to the appropriate page
CGRect bounds = self.myScrollView.bounds;
bounds.origin.x = CGRectGetWidth(bounds) * page;
bounds.origin.y = 0;
[self.myScrollView scrollRectToVisible:bounds animated:animated];
}
// page control 选项修改监听
- (IBAction)changePage:(id)sender
{
[self gotoPage:YES]; // YES = animate
}
滑动ScrollView的事件监听:
// 滑动结束的事件监听
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
// switch the indicator when more than 50% of the previous/next page is visible
CGFloat pageWidth = CGRectGetWidth(self.myScrollView.frame);
NSUInteger page = floor((self.myScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
self.myPageControl.currentPage = page;
NSLog(@"当前页面 = %d",page);
// a possible optimization would be to unload the views+controllers which are no longer visible
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
}
如果对Xcode自带的文档不熟悉可以参见:苹果Xcode帮助文档阅读指南
接下来是我学习笔记,使用Storyboard实现滑动切换的效果。
-----------------------------------------------------------------------------
新建一个项目,拖上一个UIScrollView和UIPageControl,并且建立关联:
新建一个ContentViewController,作为页面切换的内容视图:
也就是说,当滑动屏幕切换的时候,其实就是多个ContentViewController在切换。
基本结构是:
在主页面,我们首先初始化一些设置:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 初始化page control的内容
_contentList = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil];
// 一共有多少页
NSUInteger numberPages = self.contentList.count;
// 存储所有的controller
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (NSUInteger i = 0; i < numberPages; i++)
{
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
// 一个页面的宽度就是scrollview的宽度
self.myScrollView.pagingEnabled = YES; // 自动滚动到subview的边界
self.myScrollView.contentSize =
CGSizeMake(CGRectGetWidth(self.myScrollView.frame) * numberPages, CGRectGetHeight(self.myScrollView.frame));
self.myScrollView.showsHorizontalScrollIndicator = NO;
self.myScrollView.showsVerticalScrollIndicator = NO;
self.myScrollView.scrollsToTop = NO;
self.myScrollView.delegate = self;
_numberOfPages = numberPages;
_myPageControl.numberOfPages = numberPages;
_currentPage = 0;
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
接下来,我们需要一个函数,来加载ContentView页面上的元素:
// 加载ScrollView中的不同SubViewController
- (void)loadScrollViewWithPage:(NSUInteger)page
{
if (page >= self.contentList.count)
return;
// replace the placeholder if necessary
LContentViewController *controller = [self.viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
controller = [[LContentViewController alloc] init];
[self.viewControllers replaceObjectAtIndex:page withObject:controller];
}
// add the controller's view to the scroll view
if (controller.view.superview == nil)
{
CGRect frame = self.myScrollView.frame;
frame.origin.x = CGRectGetWidth(frame) * page;
frame.origin.y = 0;
controller.view.frame = frame;
[controller setLabel:[_contentList objectAtIndex:page]];
[self.myScrollView addSubview:controller.view];
}
}
然后先来处理一下PageControl的切换事件:- (void)gotoPage:(BOOL)animated
{
NSInteger page = self.myPageControl.currentPage;
// load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
// update the scroll view to the appropriate page
CGRect bounds = self.myScrollView.bounds;
bounds.origin.x = CGRectGetWidth(bounds) * page;
bounds.origin.y = 0;
[self.myScrollView scrollRectToVisible:bounds animated:animated];
}
// page control 选项修改监听
- (IBAction)changePage:(id)sender
{
[self gotoPage:YES]; // YES = animate
}
滑动ScrollView的事件监听:
// 滑动结束的事件监听
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
// switch the indicator when more than 50% of the previous/next page is visible
CGFloat pageWidth = CGRectGetWidth(self.myScrollView.frame);
NSUInteger page = floor((self.myScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
self.myPageControl.currentPage = page;
NSLog(@"当前页面 = %d",page);
// a possible optimization would be to unload the views+controllers which are no longer visible
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
}
相关文章推荐
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- IOS--UiScrollView和UIPageControl实现滑动翻页
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 【学习ios之路:UI系列】实现轮播图效果(UIImageView,UIScrollView,UIPageControl,NSTimer相结合)
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 【iOS开发-24】导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果
- UIscrollView通过Button来实现view的切换的方法
- 【Android UI】案例03滑动切换效果的实现(ViewPager)
- [iOS]UIScrollView 与 UIPageControl实现简单相册功能
- 这个例子主要展示了通过滑动实现viewflipper页面切换
- android-使用ViewGroup实现左右滑动切换界面以及界面裂开的效果
- iOS使用UIScrollView实现左右滑动UITableView和UICollectionView
- IOS之左右滑动效果的实现——利用SWRevealViewController
- 实现在ios开发中的App滑动封面 UIScrollView
- 【iOS开发-54】案例学习:通过UIScrollView的缩放图片功能练习代理模式的具体实现
- android:ViewPager实现Tabs滑动切换效果