UIScrollView使用自动布局设置以及contentSize滚动问题

当我们不再使用frame而是用约束去布局界面的时候,UIScrollView或者uitableview就遇到问题了,往里面添加的子控件发现不展示?而如果contentSize是根据UIScrollView里面的控件而决定的时候如何设置contentSize呢?
不管是UIScrollView还是uitableview,它的特殊之处就在于contentSize这个属性,想想我们在手写代码向scrollVIew添加子视图时是不是需要设置它的contentSize来确定它的滚动区域。

scrollView自身的约束(scrollView的位置和尺寸)可以像正常的UIView一样参照其父控件添加.四个约束决定了scrollView的大小和位置,这步是没有问题的.
问题的关键在于如何给scrollView内部的子控件添加约束.

scrollView内部子控件约束的添加需要遵循两个原则:

1、scrollView内部子控件的尺寸不能以scrollView的尺寸为参照
2、scrollView内部的子控件的约束必须完整

首先,子控件的尺寸不能以scrollView的尺寸为参照,那么我们有两种选择:

提供一个具体值的约束(比如200)
子控件的尺寸可以参照scrollView以外其它的控件的尺寸(如控制器的view的尺寸)

其次,约束”完整”的意思是说:子控件在水平及竖直方向上的约束要把scrollView”撑满”.

也就是说,在水平方向上,我们需要设置:

子控件左侧与父控件的距离
子控件自身的宽度
子控件右侧距父控件的距离.

竖直方向上也一样,要设置:

子控件顶部距父控件的距离
子控件的高度
子控件底部距父控件的距离.
    //给scrowview里面的view添加约束 即使约束了左右距离,也要加上宽度
    view.translatesAutoresizingMaskIntoConstraints = NO;
    [view autoPinEdgeToSuperviewEdge:ALEdgeLeading];
    [view autoPinEdgeToSuperviewEdge:ALEdgeTrailing];
    [view autoSetDimension:ALDimensionWidth toSize:SCREEN_WIDTH];
    [view autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.linkmanTableView];
    [view autoSetDimension:ALDimensionHeight toSize:cellHight];

下面说一下contentSize设置的滚动问题。
当我们在scrollview内部用约束添加一些子控件的时候,是无法获取frame的,那么一般scrollview的contentSize是根据子控件的frame来确定滚动区域的,当我们用约束确定好子控件时,这时候如果我们打印下子控件的frame,发现为0,为什么呢,因为约束和frame本质的区别,那么要想设置contentSize我们还必须知道里面的子控件的frame。这时候有一个方法叫layoutIfNeeded就派上用场了。

使用约束布局时,调用控件的layoutIfNeeded方法就能获取到frame了

//假设我们用约束设置scrollview为当前的屏幕大小。CGRectGetMaxY(self.view.frame)大于当前的屏幕。
1.
self.scrollview.contentSize = CGSizeMake(SCREEN_WIDTH, CGRectGetMaxY(self.view.frame));
//scrollview不能滚动,因为self.view使用约束,此时取到的frame为0


2.
[self.view layoutIfNeeded];
self.scrollview.contentSize = CGSizeMake(SCREEN_WIDTH, CGRectGetMaxY(self.view.frame));
//还是不能滚动,因为self.view的frame是取到了,要想滚动必须contentSize的高度或者宽度大于frame的高度或者宽度,这时候scrollview的布局是约束,取不到Frame(xcode认为取不到frame,但是能打印,为0),取不到的话那么xcode就无法蒙蔽了,无法确定frame和contentSize谁大谁小,因此也不会滚动

3.
[self.scrollview layoutIfNeeded];
[self.view layoutIfNeeded];
self.scrollview.contentSize = CGSizeMake(SCREEN_WIDTH, CGRectGetMaxY(self.view.frame));
//这里就可以完美滚动了。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值