UIScrollView 使用细节

引言:

  1. 移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限
  2. 当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容
  3. 普通的 UIView 不具备滚动功能,不能显⽰示过多的内容
  4. UIScrollView 是一个能够滚动的视图控件,可以⽤用来展⽰示⼤大量的内容,并且可以通过滚 动查看所有的内容

# 一. 常用属性

- (void)createScrollView{

    _scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
    
    //1. 设置scrollview内容的尺寸
    _scrollView.contentSize = imageView.bounds.size;
    //2. 设置内容的偏移量,contentOffset参照contentSize的坐标系
    _scrollView.contentOffset = CGPointMake(1000, 500);
    //3. 设置是否回弹
    _scrollView.bounces = YES;
    
    //4. 设置内容的边距
    _scrollView.contentInset = UIEdgeInsetsMake(10, 10, 10, 10);
    //5. 设置是否可以滚动
    _scrollView.scrollEnabled = YES;
    //6. 是否可以滚动到内容的顶部(点击状态栏)
    _scrollView.scrollsToTop = YES;
    
    //7. 按页滚动
    _scrollView.pagingEnabled =YES;
    
    //8. 是否显示水平和垂直方向的指示器
    _scrollView.showsHorizontalScrollIndicator = YES;
    _scrollView.showsVerticalScrollIndicator = YES;
    //9. 设置指示器的样式
    _scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    
    //10. 设置代理
    _scrollView.delegate = self;
    
    CGFloat imageWidth = imageView.frame.size.width;
    
    //11. 设置最小和最大缩放比例
    _scrollView.minimumZoomScale = WIDTH / imageWidth;
    _scrollView.maximumZoomScale = 1.5;
    
    
    [self.view addSubview:_scrollView];
}

# 1. 几个坐标属性示意图:


  1. UIScrollView 的 framecontentsize 属性的区分:frame 指的是这个 scrollview 的可视范围(可看见的区域),contentsize 是其滚动范围。
  2. contentinset(不带*号的一般不是结构体就是枚举),为 UIScrollView 增加额外的滚动区域。(上,左,下,右)逆时针。
  3. contentsize 属性只能使用代码设置。
  4. contentoffset 是个 CGpoint 类型的结构体,用来记录 ScrollView 的滚动位置,即记录着“框”跑到了哪里。知道了这个属性,就知道了其位置,可以通过设置这个属性来控制这个“框”的移动。
  5. 不允许直接修改某个对象内部结构体属性的成员,三个步骤(先拿到值,修改之,再把修改后的值赋回去)。

# 二. 代理方法

UIScrollView 有自己的代理方法,在代理方法中有相当全面的调用时机,借用代理方法可以制作多种,ScrollView 的高级使用.


#pragma mark - UIScrollViewDelegate

// 只要发生滚动,就会调用该方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
//    NSLog(@"scrollview滚动");
}    
                                           
// 只要zoomScale发生变化,就会调用该方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
    NSLog(@"发生缩放");
} 

// 开始拖动
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    NSLog(@"开始拖动");
}

// 将要结束拖动
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
    NSLog(@"将要结束拖动");
}

// 拖动结束
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSLog(@"拖动结束");
}

// 将要开始减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    NSLog(@"将要开始减速");
} 

// 减速结束
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    NSLog(@"减速结束");//停止滚动
}     

// 滚动动画结束
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
    NSLog(@"滚动动画结束");
}

// 返回要缩放的子视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    //返回可以进行缩放的子视图
    return scrollView.subviews[0];
}     

// 将要开始缩放
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view {
    NSLog(@"将要开始缩放");
} 

// 缩放结束
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale{
    NSLog(@"缩放结束"); 
}

// 是否可以滚动到顶部
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
    //scrollToTop = YES,才会调用该方法
    //返回YES,可以滚动到顶部;NO 不可以
    return YES;
}  

// 滚动到顶部
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{
    NSLog(@"滚动到顶部");
}