UIScrollView频道滑动(授人以鱼,不如授人以渔)
来源:互联网 发布:监控计算机的软件 编辑:程序博客网 时间:2024/04/29 23:40
内容型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]; } }}
1 0
- UIScrollView频道滑动(授人以鱼,不如授人以渔)
- 授人以鱼不如授人以渔
- 授人以鱼不如授人以渔
- 授人以鱼,不如授人以渔
- 授人以鱼,不如授人以渔
- “授人以鱼,不如授人以渔”,观BSS贴子有感;
- 管理故事:授人以鱼,不如授人以渔
- 授人以“鱼”,不如授人以“渔”,放弃一个目标,设定另一个目标
- 有用东西只有自己知道,授人以鱼不如授人以渔
- ecshop 二次开发基本思想 授之以鱼,不如授人以渔
- 曾经,授人以鱼不如授人以渔,如今,授人以渔不如让人学会找渔,成,而后推广
- 授您以鱼,不如授您以渔
- 授之以鱼,不如授之以渔
- 授之以鱼不如授之以渔
- 授之以鱼不如授之以渔
- springmvc 请求400 bad request(授之以鱼不如授之以渔,使用firebug找错)
- 授之以鱼不如授之以渔:HijackThis详解
- 授之以鱼不如授之以渔,hosts,hosts,hosts
- Bean named '*' must be of type [*], but was actually of type [*] with root case
- 2.bean的命名和实例化、依赖注入方式
- Android Application Architecture
- hihocoder1269 优化延迟(二分&优先队列)
- 在windows下codeblocks中配置pthread的库
- UIScrollView频道滑动(授人以鱼,不如授人以渔)
- webview加载html代码,其中代码中有图片
- 第一篇文章--学习小感欢迎交流
- iOS开发 ☞ UIImage部分拉伸——stretchableImageWithLeftCapWidth的使用
- 利用sqoop导出hive数据到 oracle
- Integer的大小比较
- opencv IplImage转CvMat
- iOS transitionFromViewController方法使用
- CSS padding 属性