uiscrollview要是用約束布局的話,子控件的寬和高必須確定伶氢,所以,要是有scrollview的話瘪吏,子控件viewz中癣防,還有子控件label之類的,那樣的話掌眠, label還是不要用約束布局吧
http://www.cnblogs.com/jingxin1992/archive/2017/06/30/7100933.html
http://blog.csdn.net/u014795020/article/details/51893943
推薦 : http://www.reibang.com/p/97757a74917c
xib創(chuàng)建 uiscrollview 與下面的思路一樣:
【1】uiscrollview 只設置蕾盯,距離底部的self.view的上,下蓝丙,左级遭,右望拖,4個約束,不用設置contensize,讓 容器View 把uiscrollview撐起來挫鸽。
【2】給容器View,設置上下左右的約束说敏,寬和高 一共6個約束,
【注意】: 1. 高設置的時候丢郊,也是使用 greaterThanOrEqualTo【先設置高盔沫,然后點edit,編輯成greaterThanOrEqualTo】
- 最后一個控件要設置bottom, 與容器View的距離
這樣的話枫匾,容器View 上最后一個控件的高度變化架诞,容器View的高度也變化,從而uiscrollview的高度也變化婿牍。
問題描述
開發(fā)中遇到了關于Masonry對于Scrollview的contentSize的設置問題侈贷。通過閱讀Masonry的源碼,我最終找到了我想要的方法等脂。
其實問題很簡單俏蛮,也因為我個人對于Masonry使用還不夠熟練(平時用stb挺多。上遥。)搏屑。
實際情況是這樣的,我要在一個簡單的視圖中顯示一個標題粉楚,一個時間辣恋,還有一個文字內(nèi)容,文字內(nèi)容不定模软,可能會很多伟骨,多到超出這個屏幕,由于是很固定的屏幕布局燃异,我采用的方式是携狭,ScrollView加上一個容器View(contentView), 還有三個label即可,三個label加到contentView上,使用Masonry進行布局回俐。
這里涉及到contentSize的地方就是其中一個label是放置內(nèi)容的我們叫做contentLabel,這個是多行顯示逛腿,高度不定,由于這個視圖是加到了contentView上,contentView的高度決定了ScrollView的contentSize,于是要做的就是保證contentLabel的高度動態(tài)變化的同時contentView的高度也要動態(tài)變化仅颇,才能夠保證超出屏幕之后单默,可以滑動查看超出的內(nèi)容文字。多余的不說了忘瓦,看代碼吧搁廓。可能代碼寫的不好,希望大家可以指正:flushed:
- 代碼
@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高度的動態(tài)變化 大于等于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的高度動態(tài)變化明场,底部距離固定汽摹。 此時contentView的高度變化之后,ScrollView的contentSize就發(fā)生了變化苦锨,適配文字內(nèi)容逼泣,滑動查看超出屏幕文字。
// make.height.greaterThanOrEqualTo(@16.f);//高度動態(tài)變化 大于等于16
}];
_titleLabel.text = @"測試效果";
_timeLabel.text = @"2015.09.09";
_contentLabel.text = @"為什么要默認向上的陰影呢舟舒?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)拉庶,但是呢,它卻是在Mac OS上面世的秃励,前面有提到氏仗,二者的Y軸是顛倒的。這就導致了默認的3個點位移的陰影是向上的夺鲜。在Mac上皆尔,shadowOffset的默認值是陰影向下的,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢币励?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)慷蠕,但是呢,它卻是在Mac OS上面世的食呻,前面有提到流炕,二者的Y軸是顛倒的。這就導致了默認的3個點位移的陰影是向上的仅胞。在Mac上每辟,shadowOffset的默認值是陰影向下的,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢干旧?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)渠欺,但是呢,它卻是在Mac OS上面世的莱革,前面有提到峻堰,二者的Y軸是顛倒的。這就導致了默認的3個點位移的陰影是向上的盅视。在Mac上捐名,shadowOffset的默認值是陰影向下的,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢闹击?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)镶蹋,但是呢,它卻是在Mac OS上面世的,前面有提到贺归,二者的Y軸是顛倒的淆两。這就導致了默認的3個點位移的陰影是向上的。在Mac上拂酣,shadowOffset的默認值是陰影向下的秋冰,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)婶熬,但是呢剑勾,它卻是在Mac OS上面世的,前面有提到赵颅,二者的Y軸是顛倒的虽另。這就導致了默認的3個點位移的陰影是向上的。在Mac上饺谬,shadowOffset的默認值是陰影向下的捂刺,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)募寨,但是呢族展,它卻是在Mac OS上面世的,前面有提到绪商,二者的Y軸是顛倒的苛谷。這就導致了默認的3個點位移的陰影是向上的。在Mac上格郁,shadowOffset的默認值是陰影向下的腹殿,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)例书,但是呢锣尉,它卻是在Mac OS上面世的,前面有提到决采,二者的Y軸是顛倒的自沧。這就導致了默認的3個點位移的陰影是向上的。在Mac上树瞭,shadowOffset的默認值是陰影向下的拇厢,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架)晒喷,但是呢孝偎,它卻是在Mac OS上面世的,前面有提到凉敲,二者的Y軸是顛倒的衣盾。這就導致了默認的3個點位移的陰影是向上的寺旺。在Mac上,shadowOffset的默認值是陰影向下的势决,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)為什么要默認向上的陰影呢阻塑?盡管Core Animation是從圖層套裝演變而來(可以認為是為iOS創(chuàng)建的私有動畫框架),但是呢果复,它卻是在Mac OS上面世的陈莽,前面有提到,二者的Y軸是顛倒的据悔。這就導致了默認的3個點位移的陰影是向上的传透。在Mac上,shadowOffset的默認值是陰影向下的极颓,這樣你就能理解為什么iOS上的陰影方向是向上的了(如圖4.5)";
}