ios開發中masonry的使用心得

去年作項目時用到一個第三方自動佈局的框架——Masonry,期間碰到過一些問題,如今在此總結一下:ios

1.添加約束後APP崩潰的問題:(全部問題緣由都能歸根結底到子view沒有成功加到父view上就設置約束)網絡

①若是是ios7及ios7如下的系統,崩潰的大部分以前在網絡上查過,主要元緣由說「主要是在equalTo的對象指到了父視圖的父視圖或者父視圖同級的子視圖上形成的」,後來將約束equalto全都指向了父view或者同級別的view上,以後的確奏效;框架

②若是是ios7以上的系統,系統崩潰的可能緣由:a)尚未將子view添加到父view上就開始添加約束,這樣view徹底找不到本身的約束根基在哪裏,必然會崩;b)以前遇到過一個設置navigationbar的leftbuttonitem和rightbuttonitem,可是我在viewdidload()方法直接設置約束就會引起崩潰,緣由多是在跳轉該界面時(頁面push進來時)navigationbar尚未加載完,此時就開始添加buttonitem並設置約束,因此解決方案是延時設置navigationbar的樣式:佈局

 

dispatch_after(time, dispatch_get_main_queue(), ^{動畫

        [XXX];spa

 });對象

2.添加約束不起做用的問題:get

①設置的約束不能肯定控件的惟一位置,除非有須要自適應高度的控件,須要其餘地方從新控制高度;頁面佈局

②取消掉全部控件的use autolayout 和autoresize subviews屬性,由於這是系統自帶的autolayout因此須要去掉才能發揮masonry的用處;it

3)在一些跳轉的界面,有的控件尚未加載完就設置約束確定不會起做用的,例如以前我用MJRefresh進行下拉上拉刷新時,頁面剛跳轉進來時tableview尚未加載完就設置了header,此時header的約束確定不能成功,因此解決方案也是採用延時處理;

最後放一下從網絡上摘取的幾個刷新佈局的方法,給本身mark一下:

 

  • setNeedsLayout:告知頁面須要更新,可是不會馬上開始更新。執行後會馬上調用layoutSubviews。
  • layoutIfNeeded:告知頁面佈局馬上更新。因此通常都會和setNeedsLayout一塊兒使用。若是但願馬上生成新的frame須要調用此方法,利用這點通常佈局動畫能夠在更新佈局後直接使用這個方法讓動畫生效。
  • layoutSubviews:系統重寫佈局
  • setNeedsUpdateConstraints:告知須要更新約束,可是不會馬上開始
  • updateConstraintsIfNeeded:告知馬上更新約束
  • updateConstraints:系統更新約束

這只是目前剛用masonry不久的一點當心得,若是不對,請各位大神指正啊(*^__^*) 

相關文章
相關標籤/搜索