##问题描述 开发中遇到了关于Masonry对于Scrollview的contentSize的设置问题。经过阅读Masonry的源码,我最终找到了我想要的方法。框架
其实问题很简单,也由于我我的对于Masonry使用还不够熟练(平时用stb挺多。。)。布局
实际状况是这样的,我要在一个简单的视图中显示一个标题,一个时间,还有一个文字内容,文字内容不定,可能会不少,多到超出这个屏幕,因为是很固定的屏幕布局,我采用的方式是,ScrollView加上一个容器View(contentView), 还有三个label便可,三个label加到contentView上,使用Masonry进行布局。测试
这里涉及到contentSize的地方就是其中一个label是放置内容的咱们叫作contentLabel,这个是多行显示,高度不定,因为这个视图是加到了contentView上,contentView的高度决定了ScrollView的contentSize,因而要作的就是保证contentLabel的高度动态变化的同时contentView的高度也要动态变化,才可以保证超出屏幕以后,能够滑动查看超出的内容文字。多余的不说了,看代码吧。可能代码写的很差,但愿你们能够指正:flushed:动画
##代码code
@interface DemoVC () { UIScrollView * _scrollView; UIView * _contentView; UILabel * _titleLabel; UILabel * _timeLabel; UILabel * _contentLabel; } @end @implementation DemoVC - (void)viewDidLoad { [super viewDidLoad]; [self createView]; [self __layoutSubViews]; } - (void)createView { UIScrollView * scrollView = [[UIScrollView alloc] init]; scrollView.backgroundColor = [UIColor groupTableViewBackgroundColor]; [self.view addSubview:scrollView]; _scrollView = scrollView; UIView * contentView = [[UIView alloc] init]; contentView.backgroundColor = [UIColor groupTableViewBackgroundColor]; [scrollView addSubview:contentView]; _contentView = contentView; UILabel * titleLabel = [[UILabel alloc] init]; titleLabel.textAlignment = NSTextAlignmentCenter; titleLabel.font = [UIFont systemFontOfSize:16.f]; titleLabel.textColor = CustomBlackColor; [contentView addSubview:titleLabel]; _titleLabel = titleLabel; UILabel * timeLabel = [[UILabel alloc] init]; timeLabel.textAlignment = NSTextAlignmentCenter; timeLabel.font = [UIFont systemFontOfSize:11.f]; timeLabel.textColor = [UIColor lightGrayColor]; [contentView addSubview:timeLabel]; _timeLabel = timeLabel; UILabel * contentLabel = [[UILabel alloc] init]; contentLabel.numberOfLines = 0; contentLabel.font = [UIFont systemFontOfSize:14.f]; contentLabel.textColor = [UIColor darkGrayColor]; contentLabel.backgroundColor = [UIColor clearColor]; [contentView addSubview:contentLabel]; _contentLabel = contentLabel; } - (void)__layoutSubViews { [_scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; [_contentView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(_scrollView); make.width.equalTo(_scrollView); make.height.greaterThanOrEqualTo(@0.f);//此处保证容器View高度的动态变化 大于等于0.f的高度 }]; [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(_contentView).offset(20.f); make.left.equalTo(_contentView).offset(10); make.right.equalTo(_contentView).offset(-10); make.height.equalTo(@16.f); }]; [_timeLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(_titleLabel.mas_bottom).offset(5.f); make.left.equalTo(_contentView).offset(10); make.right.equalTo(_contentView).offset(-10); make.height.equalTo(@16.f); }]; [_contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(_timeLabel.mas_bottom).offset(20.f); make.left.equalTo(_contentView).offset(10); make.right.equalTo(_contentView).offset(-10); make.bottom.equalTo(_contentView).offset(-10);// 设置与容器View底部高度固定,contentLabel高度变化的时候,因为设置了容器View的高度动态变化,底部距离固定。 此时contentView的高度变化以后,ScrollView的contentSize就发生了变化,适配文字内容,滑动查看超出屏幕文字。 // make.height.greaterThanOrEqualTo(@16.f);//高度动态变化 大于等于16 }]; _titleLabel.text = @"测试效果"; _timeLabel.text = @"2015.09.09"; _contentLabel.text = @"为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)为何要默认向上的阴影呢?尽管Core Animation是从图层套装演变而来(能够认为是为iOS建立的私有动画框架),可是呢,它倒是在Mac OS上面世的,前面有提到,两者的Y轴是颠倒的。这就致使了默认的3个点位移的阴影是向上的。在Mac上,shadowOffset的默认值是阴影向下的,这样你就能理解为何iOS上的阴影方向是向上的了(如图4.5)"; }