UIScrollView频道滑动(授人以鱼,不如授人以渔)
2017-03-07 17:19
211 查看
内容型APP(比如新闻,视频),通常采用多个页面(频道)滑动;另外,自动滚动的焦点图用到比较多的。本文简单介绍使用UIScrollView实现上述功能的原理,并附部分代码。无论是频道的滑动,还是焦点图自动滑动,都是基于UIScrollView的特性,viewController 实现UIScrollView的代理,并做一些控制即可。
核心思想:
★使用UIScrollerview作为承载view。各个频道添加到UIScrollerview上。注意:UIScrollerview需要提前知道频道数量,进而确定UIScrollerview的frame.width
★当滑动屏幕一半儿的时候,调用UIScrollView 的- (void)scrollRectToVisible:(CGRect) animated:(BOOL)方法,实现整页滚动。
★当滑动屏幕不到一半儿的时候,由于启用了UIScrollView的pagingEnabled属性,所以,UIScrollView会自动弹回原位置。
关键代码:
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; /*创建scrollerview*/
self.scrollView.pagingEnabled = YES; /*scroller 一页页滑动,而不是一直滑下去*/
self.scrollView.scrollsToTop = NO; /*点击状态栏,是否滚到顶部。不*/
self.scrollView.bounces = YES; /*到达边界回弹*/
self.scrollView.alwaysBounceHorizontal = YES; /*如果水平方向,内容宽度小于bound,仍可以滑动回弹*/
self.scrollView.alwaysBounceVertical = NO; /*如果垂直方向,内容高度小于bound,不让滑动回弹*/
self.scrollView.showsHorizontalScrollIndicator = NO;/*横向滚动条,不显示*/
self.scrollView.showsVerticalScrollIndicator = NO; /*纵向滚动条,不显示*/
/*添加到viewController中的view之上*/
[self.view addSubview:self.scrollView];
}
========================================================================
//内存警告的时候,卸载多余的page。保留current前后两个page
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
for (NSInteger i = 0; i < [self.viewControllers count]; i++) {
if (i < self.currentPage - 1 || i > self.currentPage + 1) {
[self unloadViewControllerByPage:i];
}
}
}
========================================================================
- (void)willScrollToPage:(NSInteger)page animated:(BOOL)animated {
//在滑动到page时候,处理逻辑。子类可重写该方法
}
- (void)didScrollToPage:(NSInteger)page animated:(BOOL)animated {
//在滑动到page时候,处理逻辑。子类可重写该方法
[self scrollToPage:index animated:YES];
}
========================================================================
//跳转任意频道。
- (void)scrollToPage:(NSInteger)page animated:(BOOL)animated {
NSInteger lastPage = self.currentPage;
[self setCurrentPage:page animated:animated];
if (self.currentPage != lastPage) {
[self removeViewControllerByPage:lastPage];
}
CGRect bounds = UIEdgeInsetsInsetRect(self.scrollView.bounds, self.scrollView.contentInset);
bounds.origin.x = CGRectGetWidth(bounds) * page;
bounds.origin.y = 0;
/* animated参数,一定要NO,不然滑动时候产生抖动 */
[self.scrollView scrollRectToVisible:bounds animated:NO];
}
========================================================================
#pragma mark - UIScrollViewDelegate
/*手指开始拖拽*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
if (scrollView != self.scrollView) {
return;
}
//加载后一个,前一个page
[self addViewControllerByPage:self.currentPage - 1];
[self addViewControllerByPage:self.currentPage + 1];
}
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
if (scrollView != self.scrollView) {
return;
}
//加载后一个,前一个page
[self addViewControllerByPage:self.currentPage - 1];
[self addViewControllerByPage:self.currentPage + 1];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (scrollView != self.scrollView) {
return;
}
if (decelerate) {
return;
}
CGFloat width = CGRectGetWidth(scrollView.bounds);
CGFloat position = self.scrollView.contentOffset.x;
[self setCurrentPage:round(position / width) animated:YES];
if (!decelerate) {
for (NSInteger i = 0; i < self.numberOfPages; i++) {
if (i != self.currentPage) {
[self removeViewControllerByPage:i];
}
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (scrollView != self.scrollView) {
return;
}
CGFloat width = CGRectGetWidth(scrollView.bounds);
CGFloat position = self.scrollView.contentOffset.x;
[self setCurrentPage:round(position / width) animated:YES];
for (NSInteger i = 0; i < self.numberOfPages; i++) {
if (i != self.currentPage) {
//非移除currentPage
[self removeViewControllerByPage:i];
}
}
}
核心思想:
★使用UIScrollerview作为承载view。各个频道添加到UIScrollerview上。注意:UIScrollerview需要提前知道频道数量,进而确定UIScrollerview的frame.width
★当滑动屏幕一半儿的时候,调用UIScrollView 的- (void)scrollRectToVisible:(CGRect) animated:(BOOL)方法,实现整页滚动。
★当滑动屏幕不到一半儿的时候,由于启用了UIScrollView的pagingEnabled属性,所以,UIScrollView会自动弹回原位置。
关键代码:
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; /*创建scrollerview*/
self.scrollView.pagingEnabled = YES; /*scroller 一页页滑动,而不是一直滑下去*/
self.scrollView.scrollsToTop = NO; /*点击状态栏,是否滚到顶部。不*/
self.scrollView.bounces = YES; /*到达边界回弹*/
self.scrollView.alwaysBounceHorizontal = YES; /*如果水平方向,内容宽度小于bound,仍可以滑动回弹*/
self.scrollView.alwaysBounceVertical = NO; /*如果垂直方向,内容高度小于bound,不让滑动回弹*/
self.scrollView.showsHorizontalScrollIndicator = NO;/*横向滚动条,不显示*/
self.scrollView.showsVerticalScrollIndicator = NO; /*纵向滚动条,不显示*/
/*添加到viewController中的view之上*/
[self.view addSubview:self.scrollView];
}
========================================================================
//内存警告的时候,卸载多余的page。保留current前后两个page
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
for (NSInteger i = 0; i < [self.viewControllers count]; i++) {
if (i < self.currentPage - 1 || i > self.currentPage + 1) {
[self unloadViewControllerByPage:i];
}
}
}
========================================================================
- (void)willScrollToPage:(NSInteger)page animated:(BOOL)animated {
//在滑动到page时候,处理逻辑。子类可重写该方法
}
- (void)didScrollToPage:(NSInteger)page animated:(BOOL)animated {
//在滑动到page时候,处理逻辑。子类可重写该方法
[self scrollToPage:index animated:YES];
}
========================================================================
//跳转任意频道。
- (void)scrollToPage:(NSInteger)page animated:(BOOL)animated {
NSInteger lastPage = self.currentPage;
[self setCurrentPage:page animated:animated];
if (self.currentPage != lastPage) {
[self removeViewControllerByPage:lastPage];
}
CGRect bounds = UIEdgeInsetsInsetRect(self.scrollView.bounds, self.scrollView.contentInset);
bounds.origin.x = CGRectGetWidth(bounds) * page;
bounds.origin.y = 0;
/* animated参数,一定要NO,不然滑动时候产生抖动 */
[self.scrollView scrollRectToVisible:bounds animated:NO];
}
========================================================================
#pragma mark - UIScrollViewDelegate
/*手指开始拖拽*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
if (scrollView != self.scrollView) {
return;
}
//加载后一个,前一个page
[self addViewControllerByPage:self.currentPage - 1];
[self addViewControllerByPage:self.currentPage + 1];
}
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
if (scrollView != self.scrollView) {
return;
}
//加载后一个,前一个page
[self addViewControllerByPage:self.currentPage - 1];
[self addViewControllerByPage:self.currentPage + 1];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (scrollView != self.scrollView) {
return;
}
if (decelerate) {
return;
}
CGFloat width = CGRectGetWidth(scrollView.bounds);
CGFloat position = self.scrollView.contentOffset.x;
[self setCurrentPage:round(position / width) animated:YES];
if (!decelerate) {
for (NSInteger i = 0; i < self.numberOfPages; i++) {
if (i != self.currentPage) {
[self removeViewControllerByPage:i];
}
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (scrollView != self.scrollView) {
return;
}
CGFloat width = CGRectGetWidth(scrollView.bounds);
CGFloat position = self.scrollView.contentOffset.x;
[self setCurrentPage:round(position / width) animated:YES];
for (NSInteger i = 0; i < self.numberOfPages; i++) {
if (i != self.currentPage) {
//非移除currentPage
[self removeViewControllerByPage:i];
}
}
}
相关文章推荐
- NSUrlConnection, 下载文件时当你滑动UItableView或UIscrollView时,如何避免阻塞。
- UIScrollView既可以左右滑动也可以上下滑动,定向锁定
- UIScrollView(滑动切换图片,图片的循环切换(自动))
- UIScrollView与UIPageControl+自动滑动的封装
- xib正确创建可滑动的UIScrollView
- iOS使用UIScrollView实现左右滑动UITableView和UICollectionView
- UIScrollView(滑动视图)
- UIScrollView(滑动视图)
- 关于UIScrollView在StoryBoard/XIB无法滑动:方案二
- iOS UIScrollView 停止滑动 减速
- 【转】UIButton 在 UIScrollView 中的 高亮延迟 和 滑动冲突
- 实现在ios开发中的App滑动封面 UIScrollView
- NGUI UIScrollView滑动视图的定位
- UIScrollView(滑动视图)
- 滑动视图【UIScrollView】及pageController
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- UIGestureRecognizerDelegate两三事 & UIScrollView滑动 子View上UIPanGestureRecognizer手势冲突
- iOS中的UIScrollView(滑动视图)
- Unity3d NGUI的使用(九)(UIScrollView制作滑动列表)
- UIScrollView滑动与UITableView左滑删除冲突问题解决方案