1. 程式人生 > >Masonry與iOS自動佈局

Masonry與iOS自動佈局

開源專案Masonry旨在讓自動佈局(Auto Layout)的程式碼更簡潔、可讀性更強。

Masonry ,“一個輕量級的佈局框架,採用更優雅的語法封裝自動佈局”,不需要使用XIB和Storyboard。它的創造者Jonas Budelmann  論證 了儘管自動佈局很強大,但它很快就變得冗長而不可讀。 

Masonry是一種領域特定語言(DSL),為自動佈局的所有功能提供便捷的方法,包括建立和修改約束、存取屬性、設定優先順序以及除錯支援。

GitHub上的示例程式碼展示了Masonry的  典型用法及其簡潔的語法 。 

UIEdgeInsets padding = UIEdgeInsetsMake(10
, 10, 10, 10); [view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(superview).with.insets(padding); }];

自動佈局最重要的是  約束 :UI元素間關係的數學表示式。約束包括尺寸、由優先順序和閾值管理的相對位置。它們是  新增劑 ,可能導致約束  衝突 、約束不足造成  佈局無法確定 。這兩種情況都會產生異常。 

通過程式設計的方式,不使用Masonry,也可以建立約束:建立  NSLayoutConstraint ,關聯到檢視並指定屬性和關係。Apple也提供了  

Visual Format Language ,它是另一種以文字方式描述關係的領域特定語言。 

自動佈局既不是強制的,也不是獨有的方法。“springs and struts”仍然是一種有效的方法。“springs and struts”也就是  autoresizing masks ,決定了一個檢視的父檢視大小變化時,其自身如何變化。 

  • “Springs and struts”模式需要編寫程式碼來處理各種螢幕方向、尺寸和動態內容。
  • iOS 7中的動態型別允許使用者在應用中設定文字大小偏好。
  • 支援iOS 6和iOS 7以及它們不同的元素度量。

自動佈局並非完美無缺。Apple提供了一篇  

指南 ,以常用的UIScrollView為例說明如何使用自動佈局。Matt Newburg在一篇回覆中給出了充足的理由說明為什麼  “自動佈局在檢視轉換時並不完美” 。為了彌補這種不足,他建議更多地使用層轉換。 

任何型別的自動佈局程式碼意味著你將無法獲得Xcode5提供的Interface Builder增強功能的支援。特別是視覺化地解決自動佈局問題的功能,在assistant editor的預覽模式中檢視各種螢幕方向、尺寸和iOS系統版本下的執行時佈局的功能。

Masonry,其實是簡化了iOS中的autolayout中程式碼實現自動佈局。

總結的經驗就是:

知道控制元件兩兩之間的關係:equalTo lessThanOrEqualTo 還是greaterThanOrEqualTo

對於控制元件的屬性:如圖所示

瞭解了這些,佈局就不是問題了,下原始碼下來自己寫一遍就會了。切勿眼高手低即可。