問題描述
?開發中遇到了關于Masonry對于Scrollview的contentSize的設置問題。通過閱讀Masonry的源碼,我最終找到了我想要的方法。
?其實問題很簡單,也因為我個人對于Masonry使用還不夠熟練(平時用stb挺多。。)。
?實際情況是這樣的,我要在一個簡單的視圖中顯示一個標題,一個時間,還有一個文字內容,文字內容不定,可能會很多,多到超出這個屏幕,由于是很固定的屏幕布局,我采用的方式是,ScrollView加上一個容器View(contentView), 還有三個label即可,三個label加到contentView上,使用Masonry進行布局。
?這里涉及到contentSize的地方就是其中一個label是放置內容的我們叫做contentLabel,這個是多行顯示,高度不定,由于這個視圖是加到了contentView上,contentView的高度決定了ScrollView的contentSize,于是要做的就是保證contentLabel的高度動態變化的同時contentView的高度也要動態變化,才能夠保證超出屏幕之后,可以滑動查看超出的內容文字。多余的不說了,看代碼吧。可能代碼寫的不好,希望大家可以指正: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高度的動態變化 大于等于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)";
}