UIScrollView+Masonry解決添加帶ScrollView上的view不顯示

以前遇到過這關問題查了一下資料解決了就沒在意,今天又出現這個問題做下記錄加深記憶,也給大家分享一下。

問題:

我們使用Autolayout來佈局UIScrollVie,添加的view不顯示,打印log會看到view的寬和高是0。比如:

__weak typeof(self) weak_self = self;
    [self.mainScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(weak_self).insets(UIEdgeInsetsMake(0, 0, buyingViewHeight, 0));
    }];<pre name="code" class="objc">[self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.top.right.equalTo(self.mainScrollView);
        make.height.equalTo(@60);
    }];


UIScrollView的leading/trailing/top/bottom是相對於自己的ContentSize而不是Bounds來確定的。而ContentSize又是根據子視圖決定的。

上面的代碼產生的結果就是headerView的高和寬都是0。因爲mainScrollView的四邊都是依據ContentSize,這個時候ContentSize又不確定,這樣就導致了ScrollView的子視圖不顯示,子視圖上面的點擊事件不相應等問題。

解決:

既然我們直接添加到ScrollView的view不能使用它的約束條件,我們就拋開他重新創建一個view直接覆蓋到ScrollView上,這個view的寬和高等於ContentSize的width和height:
__weak typeof(self) weak_self = self;
    [self.mainScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(weak_self).insets(UIEdgeInsetsMake(0, 0, 0, 0));
    }];
    [self.container mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.mainScrollView);
        make.width.height.equalTo(self.mainScrollView);
    }];
    [self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.top.right.equalTo(self.container);
        make.height.equalTo(@60);
    }];
大家有疑問可以評論,一起學習,共勉之!

發佈了42 篇原創文章 · 獲贊 9 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章