天天看點

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

Masonry

是iOS在控件布局中經常使用的一個輕量級架構。

Masonry

NSLayoutConstraint

使用起來更為簡潔。

Masonry

簡化了

NSLayoutConstraint

的使用方式,讓我們可以以鍊式的方式為我們的控件指定限制。本篇是對

Masonry

架構的源碼進行解析,讓你明白

Masonry

是如何對

NSLayoutConstraint

進行封裝的,以及

Masonry

架構中各個部分所扮演的角色是什麼樣的。

Masonry

架構是

Objective-C

版本的,如果你的項目是

Swift

語音的,那就得使用SnapKit布局架構了。

今天對

Masonry

架構源碼的解析思路是:先對比,給一個View添加同樣的限制時,使用

Masonry

與系統原生的差別。然後就開門見山給出

Masonry

架構主要部分的類圖,從類圖中我們來整體的分析

Masonry

架構的結構。然後再由整體到部分逐漸的細化,窺探其内部的實作細節。通過上述步驟,我們将對

Masonry

架構的内部實作進行詳細的了解。其實

Masonry

架構是輕量級的,總共的源碼也沒有多少行,但是仔細的閱讀它的實作細節,還是可以吸取很多實用的東西的。

首先

Masonry

在github上的位址是https://github.com/SnapKit/Masonry, 你可以通過上述連結

Clone

Masonry

架構,其中有

Masonry

架構介紹以及一些

Masonry

的使用示例。關于

Masonry

具體的使用方式請參考上述github上的連結。今天我們就剖析一下

Masonry

架構的源碼。

一、

Masonry

架構與

NSLayoutConstraint

調用方式的對比

首先我們

NSLayoutConstraint

為我們的View添加一個限制,然後再給出Masonry的代碼。我們要對一個View添加一個top限制,這個限制關系我們用表達式來表示就是

subView.top = superView.top + 10

。也就是子視圖的top與父視圖的top中間隔着10個pt。

  1. 使用

    NSLayoutConstraint

    添加限制:

下方這段代碼就是給subView添加了一個相對于superView的Top限制。一個View要想确定位置,一個限制是不夠的,是以可想而知,我們要寫多個下方的這樣的限制來确定一個View的相對位置。其實下方就是一個表達式,

NSLayoutConstraint

構造器中每個參數構成這個表達式的一個組成部分。由上到下我們對個個參數進行解析,參數

constraintWithItem

用來指定所限制的對象,在此就是subView。第一個attribute參數則指定限制該對象的那個屬性,在此就是subView的Top屬性。參數relatedBy用來指定限制關系,比如大于等于,小于等于或者等于某個限制值。參數toItem則指定的是限制相對的對象,在此是相對superView的,是以此處的參數是superView。第二個attribute參數就是指定superView的Top屬性。multiplier指定相對限制的倍數關系,constant則是限制的偏移量。

由上到下,NSLayoutConstraint的構造器中的參數會構成一個數學表達式,那就是subView.top = superView.top * 1 + 10,該表達式就直覺的給出了subView.top與superView.top的關系。經下方的代碼我們就為subView添加了一個相對于superView的Top限制,限制的偏移量是10。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. 使用Masonry添加上述限制

    接下來就是Masonry出場的時刻了,我們将使用Masonry添加上述限制,其代碼如下。下方給出了三種設定方式,下方三種方式是等價的,當然在Masonry中不止下方三種實作方式。下方Block中的每句話都代表着subView.top = superView.top * 1 + 10的意思,也就是說我們隻需要寫這三行代碼中的其中一種即可。使用Masonry的好處一目了然,讓你的代碼更為簡潔。

Masonry架構中支援限制的添加,限制的更新,限制的重建以及基本動畫的實作等等。功能還是蠻強大的。在Masonry架構中主要采用了鍊式調用和匿名閉包的方式來簡化限制的添加。有關Masonry更為詳細的使用方式請參見上述Masonry架構的Github連結,具體使用方式在此就不做過多的贅述了。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

二、Masonry架構的類結構

通過上述的Masonry的使用方式我們可以看出,UIView的對象可以直接調用mas_makeConstraints方法來為相應的View對象添加限制。因為mas_makeConstraints方法位于UIView的View+MASAdditions類目中,是以UIView的對象可以直接調用。同樣在View+MASAdditions類目還有其他方法供UIView的對象使用,稍後會進行詳細的介紹。

下方就是Masonry架構核心類以及類目之間的關系,下方的類圖是在閱讀Masonry源碼時畫的,僅此一份,如有雷同純屬巧合。如果下圖中的文字比較小的話,你可以圖檔另存到本地,然後放大後進行檢視,廢話少說,進入我們類圖的主題。下方的類圖中沒有包括Masonry架構中的所有的類,不過所有核心的類都在下方了。我們從左往右依次對下方的類圖進行解說。

  1. View+MASAdditions類目介紹(左邊紅框中的部分)

最左邊那一坨大類,也就是綠框中的部分,就是Masonry架構對UIView的公有類目,也就是源檔案中的View+MASAdditions的部分,在該類目中為添加了類型為MASViewAttribute的成員屬性(稍後會介紹MASViewAttribute是個神馬東西)。除了添加一系列的成員屬性外,還添加了四個公有的方法:mas_closestCommonSuperview方法負責尋找兩個視圖的最近的公共父視圖(類比兩個數字的最小公倍數)、mas_makeConstraints方法負責建立安裝限制、mas_updateConstraints負責更新已經存在的限制(若限制不存在就Install)、mas_remakeConstraints方法則負責移除原來已經建立的限制并添加上新的限制。上述方式是UIView對象設定限制主要調用的方法,稍後會詳細介紹其實作方式。

  1. MASViewAttribute類的介紹(右邊黃框中的部分)

介紹完使用者直接使用的UIView的公共類目,接下來我們來看一下使用者看不到的部分,那就是下方類圖中右邊的那一撮類。右邊的四個小類的耦合性比較高,我們先看一下MASViewAttribute類。MASViewAttribute類的結構比較簡單,主要包括三個屬性,三個方法。從MASViewAttribute這個類名中我們就能看出,這個類是對UIView和NSLayoutAttribute的封裝。使用等式來表示就是MASViewAttribute = UIView + NSLayoutAttribute + item。在MASViewAttribute類中的view屬性表示所限制的對象,而item就是該對象上可以被限制的部分。

此處的item成員屬性我們稍後要作為NSLayoutConstriant構造器中的constraintWithItem與toItem的參數。當然對于UIView來說該item就是UIView本身。而對于UIViewController,該出Item就topLayoutGuide,bottomLayoutGuide稍後會給出詳細的介紹。該類中除了兩個構造器外還有一個isSizeAttribute方法,該方法用來判斷MASViewAttribute類中的layoutAttribute屬性是否是NSLayoutAttributeWidth或者NSLayoutAttributeHeight,如果是Width或者Height的話,那麼限制就添加到目前View上,而不是添加在父視圖上。

  1. MASViewConstraint的介紹(右邊黃框中的部分)

接着我們看一下MASViewConstraint類,該類是對NSLayoutConstriant類的進一步封裝。MASViewConstraint做的最核心的一件事情就是初始化NSLayoutConstriant對象,并将該對象添加在相應的視圖上。因為NSLayoutConstriant在初始化時需要NSLayoutAttribute和所限制的View,而MASViewAttribute正是對View與NSLayoutAttribute進行的封裝,是以MASViewConstraint類要依賴于MASViewAttribute類,兩者的關系如下所示。

由下方的類圖我們可以看出MASConstraint是MASViewConstraint的父類,MASConstraint是一個抽象類,不可被執行個體化。我們可以将MASConstraint看做是一個接口或者協定。MASConstraint抽象類還有一個子類,也就是MASViewConstraint的兄弟類MASCompositeConstraint,從MASCompositeConstraint的命名中我們就可以看出來MASCompositeConstraint是限制的一個組合,也就是其中存儲的是一系列的限制。MASCompositeConstraint類的結構比較簡單,其核心就是一個存儲MASViewConstraint對象的數組,MASCompositeConstraint就是對該數組的一個封裝而已。

  1. 工廠類MASConstraintMaker(中間綠框中的部分)

兩邊的看完了,接下來我們來看一下中間的部分,也就是MASConstraintMaker類。該類就是一個工廠類,負責建立MASConstraint類型的對象(依賴于MASConstraint接口,而不依賴于具體實作)。在UIView的View+MASAdditions類目中就是調用的MASConstraintMaker類中的一些方法。上述我們在使用Masonry給subView添加限制時,mas_makeConstraints方法中的Block的參數就是MASConstraintMaker的對象。使用者可以通過該Block回調過來的MASConstraintMaker對象給View指定要添加的限制以及該限制的值。該工廠中的constraints屬性數組就記錄了該工廠建立的所有MASConstraint對象。

Masonry架構中的核心類以及類目間的關系就介紹完了,下方就是核心類和類目的類圖。下方将會逐漸的窺探其代碼實作。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

View+MASAdditions源碼解析

我們先對UIView的公共類目View+MASAdditions中的源碼進行解析,也就是對應着上方紅框中的部分。使用者是通過 View+MASAdditions中的東西來為View添加限制的,View+MASAdditions也就是Masonry架構與外界互動的通道。該部分主要對View+MASAdditions源碼進行解析,先介紹其成員屬性,然後介紹主要的方法。進入該部分的主題。

  1. View+MASAdditions主要成員屬性及getter方法

下方截圖中是View+MASAdditions類目中的部分成員屬性,其他的也與下方類似,這些屬性都是MASViewAttribute類型的。以下方的mas_left成員屬性為例,因為MASViewAttribute是View與NSLayoutAttribute的合體,是以mas_left就代表着目前View的NSLayoutAttributeLeft屬性,也就是mas_left存儲的是目前View的NSLayoutAttributeLeft屬性。同理,mas_top就代表着目前View的NSLayoutAttributeTop屬性,其他成員屬性也是一樣。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

通過上述成員屬性所對應的getter方法,我們可以對其中所存儲的内容一目了然。下方是mas_left、mas_top和mas_right成員屬性所對應的getter方法,其中所做的事情就是對MASViewAttibute進行執行個體化,在執行個體化時指定目前視圖所對應的LayoutAttribute。也就是mas_left = self + NSLayoutAttributeLeft, mas_top = self +NSLayoutAttributeTop, 當然此處的self就代表目前視圖。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. mas_makeConstraints方法解析

上面在介紹類圖的時候也提到了,使用者是通過調用mas_makeConstraints方法來為目前視圖添加限制的。下方代碼就是mas_makeConstraints函數的代碼實作,根據個人了解,對每行代碼進行了中文注釋,接下來我們來好好的看一下該函數的結構.mas_makeConstraints方法的傳回值是一個數組(NSArray),數組中所存放的就是目前視圖中所添加的所有限制。因為Masonry架構對NSLayoutConstraint封裝成了MASViewConstraint,所有此處數組中存儲的是MASViewConstraint對象。

接下來來看mas_makeConstraints的參數,mas_makeConstraints測參數是一個類型為void(^)(MASConstraintMaker *)的匿名Block(也就是匿名閉包),該閉包的傳回值為Void, 并且需要一個MASConstraintMaker工廠類的一個對象。該閉包的作用就是可以讓mas_makeConstraints方法通過該block給MASConstraintMaker工廠類對象中的MAConstraint屬性進行初始化。請參加下方block的使用。

在mas_makeConstraints方法體中,首先将目前View的translatesAutoresizingMaskIntoConstraints屬性設定成No, 然後建立了一個MASConstraintMaker工廠類對象constraintMaker,然後通過block将constraintMaker對象回調給使用者讓使用者對constraintMaker中的MAConstraint類型的屬性進行初始化。換句話說block中所做的事情就是之前使用者設定限制是所添加的代碼,比如make.top(@10) == ( constraintMaker.top = 10 )。最後調用constraintMaker的install方法對使用者指定的限制進行安裝。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. mas_updateConstraints與mas_remakeConstraints函數的解析

這兩個函數内部的實作與mas_makeConstraints類似,就是多了一個屬性的設定。mas_updateConstraints中将constraintMaker中的updateExisting設定為YES, 也就是說當添加限制時要先檢查限制是否已經被安裝了,如果被添加了就更新,如果沒有被添加就添加。而mas_remakeConstraints中所做的事情是将removeExisting屬性設定成YES, 表示将目前視圖上的舊限制進行移除,然後添加上新的限制。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. mas_closestCommonSuperview方法解析

mas_closestCommonSuperview方法負責計算出兩個視圖的公共父視圖,這個類似求兩個數字的最小公倍數。下方的代碼就是尋找兩個視圖的公共父視圖,當然是最近的那個公共父視圖。如果找到了就傳回,如果找不到就傳回nil。尋找兩個視圖的公共父視圖對于限制的添加來說是非常重要的,因為相對的限制是添加到其公共父視圖上的。比如舉個列子 viewA.left = viewB.right + 10, 因為是viewA與viewB的相對限制,那麼限制是添加在viewA與viewB的公共父視圖上的,如果viewB是viewA的父視圖,那麼限制就添加在viewB上進而對viewA起到限制作用。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

四、解析限制工廠類MASConstraintMaker

上一個部分我們分析了View+MASAdditions類目,在該類目中主要使用到了限制的工廠類MASConstraintMaker,接下我們就來窺探一下MASConstraintMaker中的内容。MASConstraintMaker之是以成為限制工廠類,因為MASConstraintMaker指派建立NSLayoutConstraint對象,因為Masonry将NSLayoutConstraint類進一步封裝成了MASViewConstraint,是以MASConstraintMaker是負責建立MASViewConstraint的對象,并調用MASViewConstraint對象的Install方法将該限制添加到相應的視圖中。

  1. MASConstraintMaker中的核心公有屬性。

下方截圖是MASConstraintMaker中的部分屬性,可以看出下方的屬性都是MSAConstriant類型,MSAConstriant是抽象類,是以下方成員變量存儲的實質上是MSAConstriant子類MASViewConstraint的對象。MASConstraintMaker就負責對MASViewConstraint進行執行個體化。一句話解釋MASViewConstraint,MASViewConstraint = View + NSLayoutConstraint + Install。稍後會給出MASViewConstraint具體技術細節的實作。在MASConstraintMaker還有一個私有數組constraints,該數組就用來記錄以及建立的Constraint對象。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. MASConstraintMake中的工廠方法解析

工廠類肯定有工廠方法,接下來我們來介紹MASConstraintMaker中的工廠方法方法,上面每個MASConstraint類型的屬性都對應一個getter方法,在getter方法中都會調用addConstraintWithLayoutAttribute方法,而addConstraintWithLayoutAttribute會調用第二個截個圖中的方法,而截圖中的這個方法就是MASConstraintMaker工廠類的工廠方法,根據提供的參數建立MSAViewConstraint對象,如果該函數的第一個參數不為空的話就會将新建立的MSAViewConstraint對象與參數進行合并組合成MASCompositeConstraint類(MASCompositeConstraint本質上是MSAViewConstraint對象的數組)的對象。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

下方就是MASConstraintMaker工廠類的工廠方法,負責建立MASConstraint類的對象。下方的方法可以建立MASCompositeConstraint和MASViewConstraint對象,上面也說了,MASCompositeConstraint對象就是MASViewConstraint對象的數組。下方建立完MASConstraint類的相應的對象後,會把該建立的對象添加進MASConstraintMaker工廠類的私有constraints數組,來記錄該工廠對象建立的所有限制。newConstraint.delegate = self; 這句話是非常重要的,由于為MASConstraint對象設定了代理,是以才支援鍊式調用(例如:maker.top.left.right.equalTo(@10))。

關于鍊式調用咱就以maker.top.left.right為例。此處的maker, 就是我們的MASConstraintMaker工廠對象,maker.top會傳回帶有NSLayoutAttributeTop屬性的MASViewConstraint類的對象,我們先做一個轉換:newConstraint = maker.top。那麼maker.top.left 等價于newConstraint.left,需要注意的是此刻調用的left方法就不在是我們工廠MASConstraintMaker中的left的getter方法了,而是被換到MASViewConstraint類中的left屬性的getter方法了。給newConstraint設定代理就是為了可以在MASViewConstraint類中通過代理來調用MASConstraintMaker工廠類的工廠方法來完成建立。下方代碼如果沒有newConstraint.delegate = self;代理的設定的話,那就不支援鍊式調用。

說了這麼多,總結一下,如果你調用maker.top, maker.left等等這些方法都會調用下方的工廠方法來建立相應的MASViewConstraint對象,并記錄在工廠對象的限制數組中。之是以能鍊式調用,就是講目前的工廠對象指定為MASViewConstraint對象的代理,是以一個MASViewConstraint對象就可以通過代理來調用工廠方法來建立另一個新的MASViewConstraint對象了,此處用到了代理模式。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. 工廠類中的install方法

雖然我們将MASConstraintMake視為工廠類,不過該工廠類的功能不僅僅建立MASConstraint的對象,還負責調用MASConstraint對象的install方法來将相應的限制安裝到想要的視圖上。在MASConstraintMake類中的install方法就是周遊工廠對象所建立所有限制對象并調用每個限制對象的install方法來進行限制的安裝。下方就是該工廠類中的install方法。

在安裝限制時,如果self.removeExisting == Yes, 那麼使用者就通過mas_remakeConstraints方法調用的install方法,就先将原來的限制進行移除掉,然後添加上新的限制。在安裝限制時,将updateExisting指派給每個限制,每個限制在調用本身的install方法時會判斷是否更新。下方就是MASConstraintMake的install方法的實作和注釋。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

解析MASViewConstraint

MASConstraintMaker工廠類所建立的對象實質上是MASViewConstraint類的對象。而MASViewConstraint類實質上是對MASLayoutConstraint的封裝,進一步說MASViewConstraint負責為MASLayoutConstraint構造器組織參數并建立MASLayoutConstraint的對象,并将該對象添加到相應的視圖中。接下來我們将對MASViewConstraint類中的内容進行解析。

  1. MASViewConstraint的對象鍊式調用探索

MASViewConstraint的對象是支援鍊式調用的,比如constraint.top.left.equalTo(superView).offset(10); 上面的這種方式就是鍊式調用,而且像equalTo(superView)這種形式也不是Objective-C中函數調用的方式,在Objective-C中是通過[]來調用函數的,而此處使用了()。接下來講分析這種鍊式的調用是如何實作的。

在MASViewConstraint類中的left, top等限制的getter方法都會調用下方的這個方法,而這個方法中所做的事情就是通過代理來調用工廠中的工廠方法來根據LayoutAttribute建立相應的MASConstraint對象。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

而像offset(10)這種調用方式是如何實作的呢?我們知道在OC中是不能通過小括号來調用方法的,那邊閉包是可以的,不過offset()不是一個簡單的閉包。在offset()的代碼分析後我們不難發現offset() = offset + (); offset的代碼實作方式如下。offset是一個getter方法的名,offset函數的傳回值是一個匿名Block, 也就是offset後邊的()。這個匿名閉包有一個CGFloat的參數,為了支援鍊式調用該匿名閉包傳回一個MASConstraint的對象。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. install方法解析

MASViewConstraint中install方法負責建立MASLayoutConstraint對象,并且将該對象添加到相應的View上。下方代碼就是install中根據MASViewConstraint所收集的參數來建立NSLayoutConstraint對象,下方的MASLayoutConstraint其實就是NSLayoutConstraint的别名。下方就是調用系統的NSLayoutConstraint為建立相應的限制對象,下方的構造器與第一部分中的NSLayoutConstraint一緻。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

建立完限制對象後,我們要尋找該限制添加到那個View上。下方的代碼段就是擷取接收該限制對象的視圖。如果是兩個視圖相對限制,就擷取兩種的公共父視圖。如果添加的是Width或者Height,那麼久添加到目前視圖上。如果既沒有指定相對視圖,也不是Size類型的限制,那麼就将該限制對象添加到目前視圖的父視圖上。代碼實作如下:

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

建立完限制對象,并且找到承載限制的視圖後,接下來就是将該限制添加到該視圖上。子啊添加限制是我們要判斷是不是對限制的更新,如果是對限制的更新的話就先擷取已經存在的限制并對該限制進行更新,如果被更新的限制不存在就進行添加。添加成功後我們将通過mas_installedConstraints屬性記錄一下本安裝的限制。mas_installedConstraints是通過運作時為UIView關聯的一個NSMutable類型的屬性,用來記錄限制該視圖的所有限制。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint
  1. UIView的私有類目UIView+MASConstraints

在MASViewConstraint中定義了一個UIView的私有類目UIView+MASConstraints,該類目的功能為UIView通過運作時來關聯一個NSMutableSet類型的mas_installedConstraints屬性。該屬性中記錄了限制該View的所有限制。代碼實作如下。

iOS開發之Masonry架構-源碼解析一、Masonry架構與NSLayoutConstraint調用方式的對比二、Masonry架構的類結構View+MASAdditions源碼解析四、解析限制工廠類MASConstraintMaker解析MASViewConstraint

轉載于:https://www.cnblogs.com/cy521/p/10266486.html