iOS中ScrollView相对布局的使用

   不知不觉中, 做iOS开发也有一段时间了,2014年的时候还坚持在某博客上每天写点东西,当时想一方面以后可以作为笔记使用,一方面也算是对自己的一个鞭笞吧,也希望每天能学点新的东西!但结果却是坚持了几个月多就断更了,最后的一段时间本来想写个Swift的零基础学习的,最终也烂尾了!现在回头看看一方面是自己工作确实是有点忙,但更多却是自己变得懒惰了,我也不想给自己找什么借口!今后的话会不定期写一些可能用得到的东西,我这次不会给自己定什么要求,只能尽量有空就多写点,也算是对于自己工作的一个积累吧!前一段时间用到了scrollView中相对布局,遇到了一些问题,这里简单说下我自己的解决方案,下面进入主题:ScrollView中添加约束 这里使用的到第三方(Manonry)来添加约束, 当然使用autoLayout也是相同的思想,不同的只是代码写的不一样而已,首先我们来看一种情况,这是我第一次写scrollview时的最早的写法:
#pragma
#pragma mark--getter and setter 

- (UIScrollView *)mainScrollView{
    if (_mainScrollView == nil) {
        _mainScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
        
        [_mainScrollView setBackgroundColor:[UIColor brownColor]];
        
        //设置contentSize
        _mainScrollView.contentSize = CGSizeMake([UIScreen mainScreen].applicationFrame.size.width, [UIScreen mainScreen].applicationFrame.size.height);
        
    }
    return _mainScrollView;
}

然后在viewDidLoad里面这么写

- (void)viewDidLoad {
    
    [super viewDidLoad];
   
    [self.view addSubview:self.mainScrollView];
    
    UIView *userView = [[UIView alloc] init];
    userView.backgroundColor = [UIColor whiteColor];
    [self.mainScrollView addSubview:userView];
    
    __weak __typeof(&*self)weakSelf = self;
    
    [userView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(weakSelf.mainScrollView).with.insets(UIEdgeInsetsMake(20, 20, 20, 20));//设置相对scrollview的上下左右约束都为20
    }];
    
}

我当时想的就是,既然scrollView的frame有了,contentSize有了, 这样加约束应该就可以了, 可事实却是这个添加的view是不会显示出来的(这里我就不贴图了)!后来也是经过多方求证以及自己的尝试才明白原因, 这里直接告诉大家了:是因为在使用相对于scrollView来添加约束的时候 , 先前的contentSize并没有用,也就是说这个时候的scrollView的大小并不确定,所以这个时候你添加的约束其实并没有用, 也就使得添加view不能正常显示出来了!那么我们需要怎么做呢? 下面我说下我的解决办法,并不一定是对的, 反正我是这么结局了,这里只是给大家提供一个参考吧!

- (void)viewDidLoad {
    
    [super viewDidLoad];
   
    [self.view addSubview:self.mainScrollView];
    
    UIView *userView = [[UIView alloc] init];
    userView.backgroundColor = [UIColor whiteColor];
    [self.mainScrollView addSubview:userView];
    
    __weak __typeof(&*self)weakSelf = self;
    
    //这里添加一个视图, 作为一个中介, 用于计算scrollView的contentSize
    [userView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(weakSelf.mainScrollView).with.insets(UIEdgeInsetsMake(0, 0, 0, 0));//相对于scrollView的约束设置为全为0
        make.width.equalTo(@([UIScreen mainScreen].applicationFrame.size.width));//这里需要设置的宽度实质上就是contentSize的width
        make.height.equalTo(@([UIScreen mainScreen].applicationFrame.size.height));//这里需要设置的宽度实质上就是contentSize的height
    }];
    
    //这个才是我们实际需要添加的视图
    UIView *finalView = [[UIView alloc] init];
    finalView.backgroundColor = [UIColor grayColor];
    [userView addSubview:finalView];
    [finalView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(userView).with.insets(UIEdgeInsetsMake(20, 20, 20, 20));
    }];
    
}

下面是效果图:


总结下就是: 当在scrollView上添加约束的时候, 设置scrollView的contentSize是没有用的, 我这里的解决办法, 是通过在scrollView上添加一个跟scrollView所有约束都是0的view, 同时设置该view的宽高(实质就是scrollView的contentSize的宽和高), 这样他就会自己计算出scrollView的大小了, 这个时候在我们添加的作为中介的视图上添加我们的视图就可以了.(这只是我的解决办法, 只是提供一种思路,并不是最优的方案, 哪位有其他好办法的还望不惜赐教!)


三, storyBoard or xib scrollView使用相对布局

首先我们来看看添加约束会遇到的问题, 在scrollView上添加一个view, 直接添加约束, 时会有一个报错的, 即使你去设置了scrollView得宽高,这个报错还会存在, 情形大致如下:



跟刚才的思想一样, 这里需要设置一个作为中介的试图, 来让他计算出这个scrollView的实际大小, 具体做法如下:


然后我们在这个作为中介的视图上添加我们真正需要的视图: 


最后的效果就这样了, 思想跟刚才说的代码的差不多, 就是用一个中介视图过度一下, 通过这个视图来计算scrollView的大小!


四.总结

          好久没写博客了, 这也是我在CSDN写的第一篇博客, 虽然写得有点简单, 后续有时间会写一些实用的东西, 也如我开头所说, 我会不定期来写一些东西, 希望自己能够坚持下去!也希望大牛勿喷,小弟水平有限, 也希望大家多多交流!   

                                                                                                                                                                      ---Chris Chen

                                                                                                                                                                       2015年8月11日                                                          






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值