iOS

UIScrollView

UIScrollView

UIScrollView是能够滚动的iOS视图控件,可以用来展示内容,并且如果内容过多可以通过滚动来查看所有的内容

1.基本设置

  1. 创建UIScrollView(实现方式多种:xib,storyboard,代码方式),将创建好的UIScrollView添加到View控件中
  2. 将需要展示的内容添加到UIScrollView中
  3. 设置UIScrollView的contentSize属性,使得UIScrollView知道需要展示内容的尺寸,即内容的滚动范围
1
2
3
self.scrollView.contentSize = CGSizeMake(400, 100);
// 如果禁止某方向的滚动,直接设置width或者height为0
self.scrollView.contentSize = CGSizeMake(400, 0);

如果UIScrollView无法滚动

  • 没有设置contentSize
  • 查看scrollEnabled属性是否设置为了NO

    1
    self.scrollView.scrollEnabled = NO;

2.常见属性

除了以上提到的contentSize以外,常见的属性还有contentOffset

  • contentInset

    1
    @property(nonatomic) UIEdgeInsets contentInset;

    在UIScrollView周围增加额外的滚动区域,一般用来避免UIScrollView的内容被其他控件挡住

  • contentOffset

    1
    @property(nonatomic) CGPoint contentOffset;

    这个属性用来表示UIScrollView滚动的位置(其实就是scrollView左上角与内容左上角的间距值),一般可以用来用作下拉刷新的判断,或者滚动时元素的隐藏。

    1
    2
    3
    4
    CGFloat offsetY = self.scrollView.contentSize.height - self.scrollView.frame.size.height;
    CGPoint offset = self.scrollView.contentOffset;
    offset.y = offsetY;
    self.scrollView.contentOffset = offset;

    OC语法禁止直接修改对象结构体属性

    1
    self.scrollView.contentOffset.y = offsetY;//这是错误的操作
  • bounces

    1
    @property(nonatomic) BOOL bounces;

    设置UIScrollView是否需要弹簧效果

    1
    self.scrollView.bounces = YES;
  • showsHorizontalScrollIndicator

    1
    @property(nonatomic) BOOL showsHorizontalScrollIndicator;

    是否显示水平滚动条

    1
    self.scrollView.showsHorizontalScrollIndicator = YES;
  • showsVerticalScrollIndicator

    1
    @property(nonatomic) BOOL showsVerticalScrollIndicator;

    是否显示垂直滚动条

    1
    self.scrollView.showsVerticalScrollIndicator = YES;

3.代理

当我们想要监听UIScrollView的一些事件的时候,我们需要给UIScrollView设置一个代理对象,当事件触发时,会自动通知他的delegate对象,给他的delegate对象发送相应的消息,从而代理可以完成一些特定的操作。
一般情况下,设置UIScrollView所在的控制器作为UIScrollView的delegate。

  1. 设置代理对象

    1
    self.scrollView.delegate = self;
  2. 控制器遵守UIScrollViewDelegate协议

    1
    2
    @interface ViewController () <UIScrollViewDelegate>
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollview;
  3. 完成协议中定义的相关方法,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /**
    *这个方法在任何方式触发contentOffset变化的时候都会被调用(包括用户拖动,减速过程,直接通过代码设置等),可以用于监控contentOffset的变化,并根据当前的contentOffset对其他view做出随动调整
    */
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
    NSLog(@"调用scrollViewDidScroll");
    }
    /**
    * 即将开始拖拽的时候调用
    */
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
    NSLog(@"调用scrollViewWillBeginDragging");
    }

4.注意点

UIScrollView控件默认有两个子控件即水平滚动条和垂直滚动条,所以当我们需要操作数组第一个元素或者最后一个元素时,不能通过数组的firstObject方法或者lastObject方法来取控件。这里提供一个简单的方法来取控件:

1
2
3
4
5
6
7
8
9
10
11
12
NSMutableArray *girdArr = [NSMutableArray array];
for (int i = 0; i<50; i++) {
int row = i / 3;
int col = i % 3;
CGFloat x = col * (10 + 20);
CGFloat y = row * (10 + 20);
self.gird = [self addGridWithX:x y:y];
if (i == 49) {
_last = self.gird.frame;
}
[girdArr addObject:self.gird];
}

可以通过取_last取出相对应的子控件

分享到