前言
Masonry中,在UIScrollView設置約束的時候,是不是被contentSize惡心到了,當我在比較SDAutoLayout和Masonry這兩個框架的時候,無意間發現可以自動contentSize, 好啦,進入正題;
正常的來說self.scrollView必須要設置contentSize
self.scrollView.contentSize = CGSizeMake(0, imageView.bottom);
UIScrollView自動布局
這種方式的實現,主要是依賴于創建一個backView內容視圖,并添加到UIScrollView上作為子視圖。UIScrollView原來的子視圖都添加到backView上,并且和這個視圖設置約束。
因為對UIScrollView進行addSubview操作的時候,本質上是往其contentView上添加。也就是backView的父視圖是contentView,通過backView撐起contentView視圖的大小,以此來實現動態改變contentSize。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.view addSubview:self.scrollView];
UIView *backView = [[UIView alloc] init];
[self.scrollView addSubview:backView];
UIImage *image = [UIImage imageNamed:@"ml_home_banner_push_image"];
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = image;
[backView addSubview:imageView];
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
[backView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.scrollView);
}];
[imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.equalTo(backView);
make.width.equalTo(@(kScreenWidth));
make.height.equalTo(@(kScreenWidth*image.size.height/image.size.width));
make.bottom.equalTo(backView);
}];
}
- (UIScrollView *)scrollView {
if (!_scrollView) {
_scrollView = [[UIScrollView alloc] init];
}
return _scrollView;
}
知識補充
大于等于和小于等于某個值的約束
[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
// 設置寬度小于等于200
make.width.lessThanOrEqualTo(@200);
// 設置高度大于等于10
make.height.greaterThanOrEqualTo(@(10));
}];