UI基础 - UIScrollView

■ 简言

1. UIScrollView 是所有滚动视图的基类,比如 UITableView、UITextView 等都是其子类。它适用于展示的内容显⽰不下(如超大图片等)、内容过多(图⽂混排)、滚动头条、相册等

■ 使用方式

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     self.view.backgroundColor = [UIColor yellowColor];
 4     // 隐藏导航栏
 5     self.navigationController.navigationBar.hidden = YES;
 6     // 图片
 7     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 100, 150)];
 8     imageView.image = [UIImage imageNamed:@"4.jpg"];
 9     
10     // UIScrollView
11     UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 20, self.view.frame.size.width - 20, 400)];
12     scrollView.backgroundColor = [UIColor purpleColor];
13     [scrollView addSubview:imageView];
14     scrollView.contentSize = CGSizeMake(self.view.frame.size.width*1.5, 400*2);// 滚动范围
15     // scrollView.scrollEnabled = NO; // 是否可以滚动
16     scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; // 滚动条颜色
17     // scrollView.showsHorizontalScrollIndicator = NO; // 是否显示水平滚动条
18     // scrollView.showsVerticalScrollIndicator = NO;   // 是否显示垂直滚动条
19     
20     // 方向锁:子视图正在某一方向滑动过程中,不能再向其他方向滑动,只有当子视图停下来以后才可以滑动
21     scrollView.directionalLockEnabled = YES;
22     // scrollView.contentOffset = CGPointMake(50,50); // 子视图的原点相对于 scrollView 的原点的偏移量
23     scrollView.contentInset = UIEdgeInsetsMake(80, 100, 60, 0); // 内容边距
24     scrollView.bounces = YES; // 弹框效果
25     scrollView.pagingEnabled = YES; // 翻页效果:YES 当滑动超过一半的时候就会翻页,覆盖滑动效果
26     [self.view addSubview:scrollView];
27 }

运行效果

■ 应用场景

1. 实现翻页效果,需要注意的是滑动过程中小白点的闪跳问题

  1 #import "ViewController.h"
  2 @interface ViewController ()<UIScrollViewDelegate>{
  3     
  4     BOOL _isLock;// 解决小白点闪跳的问题
  5     UIScrollView  *_scrollView;
  6     UIPageControl *_pageControl;
  7 }
  8 @end
  9 
 10 @implementation ViewController
 11 
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14     
 15     // 导航栏隐藏时会造成 UIScrollView 子视图向下偏移 20 个点
 16     self.navigationController.navigationBar.hidden = YES;
 17     
 18     // UIScrollView
 19     _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height-60)];
 20     // 当导航栏不显示时,系统用于适应所谓的安全区域而自动调整滚动视图等一类控件的偏移
 21     // 所造成视图下移 20 个点的问题,只需一行代码即可解决
 22     _scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
 23     _scrollView.backgroundColor = [UIColor cyanColor]; // 方便查看效果
 24     _scrollView.contentSize = CGSizeMake(self.view.frame.size.width * 5, _scrollView.frame.size.height);
 25     _scrollView.delegate = self;
 26     _scrollView.bounces = YES;
 27     _scrollView.directionalLockEnabled = YES;
 28     _scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
 29     
 30     // 缩放系数
 31     _scrollView.maximumZoomScale = 10;//  scrollView 最大缩放比例,默认是 1
 32     _scrollView.minimumZoomScale = 0.1;// scrollView 最少缩小比例
 33     [self.view addSubview:_scrollView];
 34     
 35     // 添加图片
 36     for (int i = 0; i < 5; i ++) {
 37         UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width*i,20, self.view.frame.size.width, _scrollView.frame.size.height - 40 - 20)];
 38         imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i+1]];
 39         [_scrollView addSubview:imageView];
 40     }
 41     
 42     // UIPageControl:分页控件
 43     // 它可以像 button 一样添加事件,只不过事件触发使用是 UIControlEventsValueChanged
 44     _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0,_scrollView.frame.size.height+10,self.view.frame.size.width,40)];
 45     _pageControl.backgroundColor = [UIColor blackColor];
 46     _pageControl.numberOfPages = 5; // 滚动点个数
 47     _pageControl.hidesForSinglePage = YES;// 只有一页时是否隐藏分页控件
 48     [_pageControl addTarget:self action:@selector(changePage:) forControlEvents:UIControlEventValueChanged];
 49     [self.view addSubview:_pageControl];
 50 }
 51 
 52 #pragma mark - 自定义方法
 53 // 过半则翻页
 54 -(void)changePage:(UIPageControl *)pageControl{
 55     // 当前页总页数
 56     NSLog(@"pageControl.currentPage = %ld,%ld",pageControl.currentPage,pageControl.numberOfPages);
 57     _isLock = YES;
 58     [_scrollView setContentOffset:CGPointMake(self.view.frame.size.width * pageControl.currentPage,0) animated:YES];
 59 }
 60 
 61 #pragma mark - <UIScrollViewDelegate>
 62 // 滚动时
 63 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
 64     NSLog(@"%s",__FUNCTION__);
 65     
 66     // 当 _pageControl 和滚动视图同时使时,点击 _pageControl 会导致小白点的闪烁,加上使用一个锁的判断即可解决
 67     if (!_isLock) {
 68         // 翻页过半,跳动一个点
 69         int number = (scrollView.contentOffset.x + self.view.frame.size.width/2) / self.view.frame.size.width;
 70         _pageControl.currentPage = number;
 71     }
 72 }
 73 
 74 // 将要开始拖拽时
 75 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
 76     NSLog(@"%s",__FUNCTION__);
 77 }
 78 
 79 // 将要结束拖拽时
 80 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
 81     NSLog(@"%s",__FUNCTION__);
 82 }
 83 
 84 // 结束拖拽时
 85 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
 86     NSLog(@"%s",__FUNCTION__);
 87 }
 88 
 89 // 将要开始减速时
 90 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
 91     NSLog(@"%s",__FUNCTION__);
 92 }
 93 
 94 // 结束减速时触发(停止时)
 95 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
 96     NSLog(@"%s",__FUNCTION__);
 97     _pageControl.currentPage = (scrollView.contentOffset.x + self.view.frame.size.width/2.0)/ self.view.frame.size.width;
 98     // 停留页面
 99     [scrollView setContentOffset : CGPointMake(self.view.frame.size.width * _pageControl.currentPage, 0) animated:YES];
100 }
101 
102 // 视图已经结束滚动动画
103 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
104     NSLog(@"%s",__FUNCTION__);
105     // 解锁
106     _isLock = NO;
107 }
108 
109 // 只要 scrollView 缩放
110 - (void)scrollViewDidZoom:(UIScrollView *)scrollView{
111     NSLog(@"%s",__FUNCTION__);
112 }
113 
114 // 将要缩放
115 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
116     NSLog(@"%s",__FUNCTION__);
117 }
118 
119 // 完成放大或缩小时
120 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale{
121     NSLog(@"%s",__FUNCTION__);
122 }
123 
124 // 指定某个滚动视图中的子视图可以被放大、缩小
125 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
126     NSLog(@"%s",__FUNCTION__);
127     return nil;
128 }
129 
130 // 只有当 scrollsToTop 属性设置为 YES 时,该方法才会触发:进一步询问点击状态条是否有效
131 - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
132     NSLog(@"%s",__FUNCTION__);
133     return YES;
134 }
135 
136 // 当点击状态条并且 scrollView 滑动到顶端时
137 - (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{
138     NSLog(@"%s",__FUNCTION__);
139 }
140 
141 @end

运行效果

 

posted on 2018-04-09 10:47  低头捡石頭  阅读(24)  评论(0编辑  收藏  举报

导航