uikit——Auto Layout——NSLayoutAnchor

来源:互联网 发布:淘宝买黄金项链可靠吗 编辑:程序博客网 时间:2024/06/02 01:16

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
原创粉丝点击