uikit——Auto Layout——NSLayoutAnchor

本文介绍了NSLayoutAnchor在Auto Layout中的应用,包括NSLayoutXAxisAnchor、NSLayoutYAxisAnchor和NSLayoutDimension。这些类帮助创建更简洁、易读的约束,提供类型检查以避免无效约束。通过示例展示了如何生成水平、垂直和尺寸约束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值