把大神的一些想法整理出來,方便以后查閱,如果涉及侵權問題,請與我聯(lián)系...
- 為什么要用一個container包含其他subview?
- 為什么指定了edges 還要指定width? 不是多此一舉嗎?
- 使用下面的代碼,可以確定scrollView的contentSize
- 例子
一個寬等于scrollview, 高等于scrollview高度1.5倍的view 然后scrollview成功的計算出了ContentSize
UIView *container = [UIView new];
[scrollView addSubview:container];
[container mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(scrollView);// scrollView根據(jù)container的四邊距計算contentsize
make.width.equalTo(scrollView);// 如果我們需要豎向的滑動 就把width設為和scrollview相同
make.height.equalTo(scrollView).multipliedBy(1.5);// 自定義滾動的高度范圍
}];
UIScrollView依靠與其subviews之間的約束來確定ContentSize的大小
換成代碼 是這個樣子:
關鍵就在于: scrollview因為下面的約束, 以container的大小來計算ContentSize
[scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(container.mas_left);
make.right.equalTo(container.mas_right);
make.top.equalTo(container.mas_top);
make.bottom.equalTo(container.mas_bottom);
}];
- 這是因為UIScrollView是個非常特殊的view, UIScrollView與其subview之間相對位置的約束 并不會直接用于frame的計算 而是會轉(zhuǎn)化為對ContentSize的計算
- 也就是說,當UIScrollView知道了上下左右的約束分別指向subview什么位置之后 只要subview的位置固定下來了 ContentSize的大小就確定下來了
上面的代碼效果等同于:
[container mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(scrollView);// scrollView根據(jù)container的四邊距計算contentsize
}];
回到開頭的問題:
一般情況下我們使用UIScrollView來進行autolayout布局,都是為了實現(xiàn)有很多非重復性的subview ,如果使用UITableView和UICollectionView太麻煩,這時直接使用UIScrollView就會很靈活
如果我們需要豎向的滑動 就把width設為和scrollview相同
make.edges.equalTo(scrollView);
make.width.equalTo(scrollView);
- 如果需要橫向的滑動 就把height設為和scrollview相同
make.edges.equalTo(scrollView);
make.height.equalTo(scrollView);
總結:
- 確定好scrollView的約束, scrollView位置就確定下來
- 使用一個單一的containerView作為容器,然后把所有的subview添加到containerView容器中,并添加containerView與scrollView之間的約束 就可以獲得正確的ContentSize了,而子View的約束則是相對containerView來添加就可以了.