【原】Masonry+UIScrollView的使用注意事項
本文轉載請注明出處 —— polobymulberry-博客園
1.問題描述
我想實現的使用在一個UIScrollView依次添加三個UITableView(tableView1、tableView2、tableView3)。最后想達到的效果就像下圖這樣:
或者用這張圖更形象點:
然后我的代碼大概的樣子
// 自定義了一個UIScrollView為ICScrollView // 在ViewController中添加到self.view中 // ViewController.m - (void)viewDidLoad { // ... [self.view addSubview:self.scrollView]; // ... } - (ICScrollView *)scrollView { // ... if (_scrollView == nil) { _scrollView = [[ICScrollView alloc] init]; _scrollView.contentSize = CGSizeMake(width, height); } // ... } // 然后我在ICScrollView中重載了init函數 // ICScrollView.m - (instancetype)init { self = [super init]; if (self) { [self addSubview:self.tableView1]; [self addSubview:self.tableView2]; [self addSubview:self.tableView3]; [self layoutScrollSubViews]; } return self; } - (void)layoutScrollSubViews { [self.tableView1 mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(self.size); make.leading.mas_equalTo(self.mas_leading); make.top.mas_equalTo(self.mas_top); }]; [self.tableView2 mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(self.size); make.leading.mas_equalTo(self.tableView1.mas_trailing); make.top.mas_equalTo(self.mas_top); }]; [self.tableView3 mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(self.size); make.leading.mas_equalTo(self.tableView2.mas_trailing); make.top.mas_equalTo(self.mas_top); }]; }
上述代碼用Masonry給要添加到scrollView上的3個tableView添加了約束。但是當我顯示的時候,發現三個tableView確實是初始化了,也添加到scrollView上了,但是寬度和高度均為0。問題就是我約束都設置好了,為什么還會出現問題?
2.問題分析
出現使用autolayout后,view的寬高均為0。很可能是因為約束設置出錯。搜索了無數文章,嘗試了無數可能后,我覺得問題很可能處在scrollView上。所以我搜索autolayout+UIScrollView,還真發現了UIScrollView在Autolayout使用下的一些問題。最主要的問題就是:
當我使用make.leading.mas_equalTo(self.mas_leading) 的時候,其實這里的self.mas_leading指的是scrollView的contentSize的那個leading。
有沒有發現,此時我的contentSize還沒有指定,因為他是我在_scrollView = [[ICScrollView alloc] init]; 后面添加的,而此時約束已經完成了。所以最簡單的辦法是把_scrollView.contentSize = CGSizeMake(width, height); 放到layoutScrollSubViews之前,就可以啦!具體按照你的代碼習慣添加吧。


