关于ScrollView的学习

Reading time ~1 minute

写在前面的话


ScrollView应该是ios里面最常用的控件之一了,前两天在项目泛艺术App里面寻找一个UI的解决方案的时候曾经想过使用ScrollView, 虽然最后使用的是它的儿子TableView,中间还是在ScrollView上吃了点苦头, 于是才决定写个demo好好研究下ScrollView。

ScrollView的探究过程


ScrollView的特性相信大家都知道,有几个非常重要的属性:frame,contentSize,contentOffset,contentInset

-(UIScrollView *)scrollView{
    if (_scrollView == nil) {
        _scrollView                 = [[UIScrollView alloc] init];
        _scrollView.delegate        = self;
        _scrollView.scrollEnabled   = true;
        _scrollView.bounces         = true;
        _scrollView.showsHorizontalScrollIndicator  = false;
        _scrollView.showsVerticalScrollIndicator    = true;
        _scrollView.userInteractionEnabled          = YES;
        _scrollView.backgroundColor                 = [UIColor blueColor];
        _scrollView.contentInset                    = UIEdgeInsetsMake(100, 100, 100, 0);
        [self.view addSubview:_scrollView];
        [_scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(self.view.mas_left);
            make.top.equalTo(self.view.mas_top);
            make.right.equalTo(self.view.mas_right);
            make.bottom.equalTo(self.view.mas_bottom);
        
  
    return _scrollView;
}
-(UIView *)containerView{
    if (_containerView == nil) {
        _containerView = [[UIView alloc] init];
        [self.scrollView addSubview:_containerView];
        [_containerView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(self.view.mas_left);
            make.top.equalTo(@(0));
            make.right.equalTo(self.view.mas_right);
            make.height.equalTo(@(SCREEN_HEIGHT * 2));
        }];
        self.scrollView.contentSize = CGSizeMake(SCREEN_WIDTH, SCREEN_HEIGHT * 2);
    }
    return _containerView;
}
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
     NSLog(@"%f %f",self.containerView.frame.origin.x,self.containerView.frame.origin.y);
} 

ScrollView的额外问题


通过上面的探究过程可以知道我们可以直接在sb文件里面对scrollView使用autoLayout。由此引发了我一个疑问:能否通过修改containerView的高度约束来修改scrollView的contentSize么,还是说scrollView的contentSize在awakeFromNib的时候就定死了,只能通过手动设置重新改大小呢? 通过demo测试发现,这个想法是可行的,但是在重新设置了约束之后需要调用[self.view layoutIfNeeded];这样scrollView才会重新计算contentSize。 还有个相似的方法[self.view updateConstraints];这个方法不会立马更新scrollView的contentSize,而是在一定时间后更新,我猜测这个时间应该就是更新UI的动画时间。 为了防止计算出错还是建议都使用layoutIfNeeded方法。

ScrollView的总结


关于scrollView目前想知道的就这些,这篇博客做个总结:使用scrollView最好是只添加一个UIView作为容器View,然后再在这个容器View里面设置你的布局。 这种方式很像Android的XML文件布局,只有一个LinearLayout作为容器。这样做的好处就是更改contentSize非常方便,直接修改容器View的高度约束,然后调用layoutIfNeeded方法就可。 切记要给容器View设置上下左右间距以及宽高.

ViewPage源代码学习

Published on November 07, 2016

Android UDP服务

Published on June 23, 2016