【原】Masonry+UIScrollView的使用注意事項

【原】Masonry+UIScrollView的使用注意事項

本文轉載請註明出處 —— polobymulberry-博客園html

1.問題描述

我想實現的使用在一個UIScrollView依次添加三個UITableView(tableView一、tableView二、tableView3)。最後想達到的效果就像下圖這樣:git

QQ20160110-0@2x

或者用這張圖更形象點:github

QQ20160110-1@2x

而後個人代碼大概的樣子函數

// 自定義了一個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。問題就是我約束都設置好了,爲何還會出現問題?ui

2.問題分析

出現使用autolayout後,view的寬高均爲0。極可能是由於約束設置出錯。搜索了無數文章,嘗試了無數可能後,我以爲問題極可能處在scrollView上。因此我搜索autolayout+UIScrollView,還真發現了UIScrollView在Autolayout使用下的一些問題。最主要的問題就是:spa

當我使用make.leading.mas_equalTo(self.mas_leading) 的時候,其實這裏的self.mas_leading指的是scrollView的contentSize的那個leading。code

有沒有發現,此時個人contentSize尚未指定,由於他是我在_scrollView = [[ICScrollView alloc] init]; 後面添加的,而此時約束已經完成了。因此最簡單的辦法是把_scrollView.contentSize = CGSizeMake(width, height); 放到layoutScrollSubViews以前,就能夠啦!具體按照你的代碼習慣添加吧。htm

3.參考文章

  1. AutoLayout深刻淺出三[相遇Scrollview]
  2. UIScrollView 實踐經驗
相關文章
相關標籤/搜索