1. 程式人生 > >uikit——Auto Layout——NSLayoutAnchor

uikit——Auto Layout——NSLayoutAnchor

NSLayoutAnchor

anchor,即錨,是對UI物件attribute(NSLayoutAttribute)的封裝,因此用anchor生成constraint,本質等同用NSLayoutConstraint生成constraint anchor以factory設計模式實現,NSLayoutAnchor為虛父類 NSLayoutAnchor concrete subclass包括:
  • NSLayoutXAxisAnchor:x-axis attribute
  • NSLayoutYAxisAnchor:y-axis attribute
  • NSLayoutDimension:size attribute
顯然兩個anchor必須是同一concrete subclass才能生成valid constraint NSLayoutAnchor生成constraint相較於直接使用NSLayoutConstraint生成constraint有以下優點:
  • 程式碼更加簡潔,簡明,易讀
  • NSLayoutAnchor concrete subclass增加型別檢查,防止生成invalid constraint
注:儘管NSLayoutAnchor相關concrete subclass增加型別檢查,它僅僅是確保使用同一concrete subclass生成constraint,但仍然會生成invalid constraint,比如使用leadingAnchor和leftAnchor生成constraint,因為leadingAnchor和leftAnchor都為NSLayoutXAxisAnchor,因此語法允許,但auto layout邏輯上不允許,這會導致runtime crash 千萬別直接使用NSLayoutAnchor,根據constraint生成型別使用合適concrete subclass:
  • NSLayoutXAxisAnchor:生成horizontal constraint
  • NSLayoutYAxisAnchor:生成vertical constraint
  • NSLayoutDimension:生成size constraint
注:view anchor屬性自動提供了正確的concrete subclass,但view並沒有直接提供margin anchor屬性,需通過view layoutMarginsGuide訪問margin anchor屬性 NSLayoutAnchor介面:
/* These methods return an inactive constraint of the form thisAnchor = otherAnchor.
 */
- (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor;
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor;
- (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor;

/* These methods return an inactive constraint of the form thisAnchor = otherAnchor + constant.
 */
- (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor constant:(CGFloat)c;
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor constant:(CGFloat)c;
- (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutAnchor<AnchorType> *)anchor constant:(CGFloat)c;
NSLayoutAnchor生成以下relationship constraint:
  • anchor1 = anchor2
  • anchor1 >= anchor2
  • anchor1 <= anchor2
  • anchor1 = anchor2 + c
  • anchor1 >= anchor2 + c
  • anchor1 <= anchor2 + c
注:constant不允許直接賦值給anchor

NSLayoutXAxisAnchor

NSLayoutXAxisAnchor是NSLayoutAnchor concrete subclass,對NSLayoutAnchor介面進行了具體實現,增加了型別檢查功能,傳入引數必須是NSLayoutXAxisAnchor型別,無新增介面

NSLayoutYAxisAnchor

NSLayoutYAxisAnchor是NSLayoutAnchor的concrete subclass,對NSLayoutAnchor介面進行了具體實現,增加了型別檢查功能,傳入引數必須是NSLayoutYAxisAnchor型別,無新增介面

NSLayoutDimension

NSLayoutDimension是NSLayoutAnchor的concrete subclass,對NSLayoutAnchor介面進行了具體實現,增加了型別檢查功能,傳入引數必須是NSLayoutDimension型別,並新增了介面 NSLayoutDimension新增介面:
/* These methods return an inactive constraint of the form 
    thisVariable = constant.
*/
- (NSLayoutConstraint *)constraintEqualToConstant:(CGFloat)c;
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToConstant:(CGFloat)c;
- (NSLayoutConstraint *)constraintLessThanOrEqualToConstant:(CGFloat)c;

/* These methods return an inactive constraint of the form 
    thisAnchor = otherAnchor * multiplier.
*/
- (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m;
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m;
- (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m;

/* These methods return an inactive constraint of the form 
    thisAnchor = otherAnchor * multiplier + constant.
*/
- (NSLayoutConstraint *)constraintEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m constant:(CGFloat)c;
- (NSLayoutConstraint *)constraintGreaterThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m constant:(CGFloat)c;
- (NSLayoutConstraint *)constraintLessThanOrEqualToAnchor:(NSLayoutDimension *)anchor multiplier:(CGFloat)m constant:(CGFloat)c;
NSLayoutDimension新增介面生成以下relationship constraint:
  • anchor1 = c
  • anchor1 >= c
  • anchor1 <= c
  • anchor1 = m * anchor2
  • anchor1 >= m * anchor2
  • anchor1 <= m * anchor2
  • anchor1 = m * anchor2 + c
  • anchor1 >= m * anchor2 + c
  • anchor1 <= m * anchor2 + c
注:NSLayoutDimension新增relationship只能表示兩個UI物件size relationship,constant允許直接賦值給anchor