之前使用Masonry對UIScrollView進行過約束,當時是遇到了問題的,怎麼約束都不對,因為趕進度直接改用frame了也沒有對問題深究。就這樣過了很久.........,直到前一段換工作的時候面試官問到,使用Masonry對UIScrollView自動佈局應該註意些什麼?額....,猶豫了一 ...
之前使用Masonry對UIScrollView進行過約束,當時是遇到了問題的,怎麼約束都不對,因為趕進度直接改用frame了也沒有對問題深究。就這樣過了很久.........,直到前一段換工作的時候面試官問到,使用Masonry對UIScrollView自動佈局應該註意些什麼?額....,猶豫了一段時間我只能搪塞說我一般都是用frame進行設置的,暫時沒有遇到什麼問題。雖然這麼回答也沒什麼,但是感覺終歸不是很好。出來混遲早是要還的!剛好最近公司不忙,想起了這個問題,那麼就研究記錄一下吧!
對UIScrollView的約束有很多方式,我只講其中一種易懂、直觀的方式
UIScrollView約束的關鍵是設置它的contentSize的大小,否則無法進行滾動顯示。
給UIScrollView添加一個過渡視圖containerView,這個containerView作為所有子控制項的父視圖,然後再設置containerView相對於UIScrollView的約束constraint和子控制項相對於containerView的約束constraint。
最後再將最後一個子視圖的右邊距,或底邊距設置成containerView的右邊距,或底邊距,以此來設置scrollView的contentSize在水平方向,或垂直方向的大小。
UIScrollView豎向滑動時,就把containerView的width固定
UIScrollView橫向滑動時,就把containerView的height固定
如果看完上面的描述還沒有明白,那直接看下麵的代碼,UIScrollView的約束其實都是一樣的,記住即可
水平方向
UIScrollView *horizontalScrollView = [[UIScrollView alloc] init]; horizontalScrollView.backgroundColor = [UIColor orangeColor]; horizontalScrollView.pagingEnabled =YES; // 添加scrollView添加到父視圖,並設置其約束 [self.view addSubview:horizontalScrollView]; [horizontalScrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.and.left.mas_equalTo(10); make.right.mas_equalTo(-10); make.height.mas_equalTo(100); }]; // 創建過渡視圖並設置contentSize和其約束 UIView *horizontalContainerView = [[UIView alloc] init]; [horizontalScrollView addSubview:horizontalContainerView]; [horizontalContainerView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(horizontalScrollView); make.height.equalTo(horizontalScrollView);#//水平滾動高度固定,這個很重要 }]; //過渡視圖上添加子視圖 UIView *previousView =nil; for (int i =0; i <10; i++) { UILabel *label = [[UILabelalloc]init]; label.textAlignment =NSTextAlignmentCenter; label.backgroundColor = [UIColorcolorWithHue:(arc4random() %256 / 256.0) saturation:(arc4random() %128 /256.0) +0.5 brightness:(arc4random() %128 /256.0) +0.5 alpha:1]; label.text = [NSStringstringWithFormat:@"第 %d個視圖", i]; //添加到過渡視圖,並設置子視圖的約束 [horizontalContainerView addSubview:label]; [label mas_makeConstraints:^(MASConstraintMaker *make) { make.top.and.bottom.equalTo(horizontalContainerView); make.width.equalTo(horizontalScrollView); if (previousView) { make.left.mas_equalTo(previousView.mas_right); } else { make.left.mas_equalTo(0); } }]; previousView = label; } #// 設置過渡視圖的右距(此設置將影響到scrollView的contentSize)這個也是關鍵的一步 [horizontalContainerView mas_makeConstraints:^(MASConstraintMaker *make) { make.right.mas_equalTo(previousView.mas_right); }];
垂直平方向
UIScrollView *verticalScrollView = [[UIScrollView alloc] init]; verticalScrollView.backgroundColor = [UIColor greenColor]; verticalScrollView.pagingEnabled =YES; // 添加scrollView添加到父視圖,並設置其約束 [self.view addSubview:verticalScrollView]; [verticalScrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(10); make.bottom.and.right.mas_equalTo(-10.0); make.height.mas_equalTo(100); }]; // 設置scrollView的子視圖,即過渡視圖contentSize,並設置其約束 UIView *verticalContainerView = [[UIView alloc] init]; [verticalScrollView addSubview:verticalContainerView]; [verticalContainerView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.left.bottom.and.right.equalTo(verticalScrollView); make.width.equalTo(verticalScrollView);#//垂直滾動寬度固定,這個很重要 }]; //過渡視圖添加子視圖 UIView *lastView =nil; for (NSInteger index =0; index <10; index++) { UILabel *label = [[UILabelalloc]init]; label.textAlignment =NSTextAlignmentCenter; label.backgroundColor = [UIColorcolorWithHue:(arc4random() %256 / 256.0) saturation:(arc4random() %128 /256.0) +0.5 brightness:(arc4random() %128 /256.0) +0.5 alpha:1]; label.text = [NSStringstringWithFormat:@"第 %ld個視圖", index]; //添加到過渡視圖,並設置子視圖的約束 [verticalContainerView addSubview:label]; [label mas_makeConstraints:^(MASConstraintMaker *make) { make.left.and.right.equalTo(verticalContainerView); make.height.mas_equalTo(verticalScrollView.mas_height); if (lastView) { make.top.mas_equalTo(lastView.mas_bottom); } else { make.top.mas_equalTo(0); } }]; lastView = label; } #// 設置過渡視圖的底邊距(此設置將影響到scrollView的contentSize)這個也是關鍵的一步 [verticalContainerView mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(lastView.mas_bottom); }];
xib對UIScrollerView的佈局可以參考下麵的文章
https://www.jianshu.com/p/1d3bb3cf7ee5
https://blog.csdn.net/dreams_deng/article/details/80523485