你的位置:首页 > 操作系统

[操作系统]iOS中文API之NSLayoutconstraint


  AutoLayout为开发者提供了一种不同于传统对于UI元素位置指定的布局方法。以前,不论是在IB里拖放,还是在代码中写,每个UIView都会有自己的frame属性,来定义其在当前视图中的位置和尺寸。使用AutoLayout的话,就变为了使用约束条件来定义view的位置和尺寸。这样的最大好处是一举解决了不同分辨率和屏幕尺寸下view的适配问题,另外也简化了旋转时view的位置的定义,原来在底部之上10像素居中的view,不论在旋转屏幕或是更换设备(iPad或者iPhone5或者以后可能出现的mini iPad)的时候,始终还在底部之上10像素居中的位置,不会发生变化。

 

  约束定义了两个用户借口之间的关系,通过创建约束来满足我们的要求(可见控件在布局系统中的位置和尺寸)。每个约束是一个线性方程,具有以下格式:

  item1.attribute1 = multiplier × item2.attribute2 + constant

 

  在这个方程式中,attribute1 和 attribute2 是自动布局可以调整时解决这些制约因素的变量。当你创建约束定义其他值。例如,如果您定义两个按钮的相对位置,第二个按钮的起始位置距离第一个按钮结束位置后8像素点。这种关系为线性方程如下所示:      

  button2.leading = 1.0 × button1.trailing + 8.0

 

  另外。约束并不局限于平等关系。它们还可以使用大于或等于 (> =) 或小于或等于 (< =) 来描述这两个属性之间的关系。约束还具有 1 到 1000 之间的优先级。具有优先级 1000 的约束是必需的。小于 1,000 的所有优先级是可选的。默认情况下,所有约束都是需要 (优先级 = 1,000)。在解决所要的约束后,AutoLayout将从最高到最低的优先级顺序来处理所有可选约束,如果它不能解决一个可选的约束,它将尝试来作为尽可能接近所需的结果,然后移动到下一个约束。这种不平等、 平等和优先级的结合给你强大的灵活性。通过结合多个约束,您可以定义动态地适应用户界面元素在屏幕中的大小和位置。

 

  创建约束

  + (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(nullable NSDictionary<NSString *,id> *)metrics views:(NSDictionary<NSString *, id> *)views

  通过VFL描述创建约束

参数:

format

约束的格式规范.


opts

选项描述多有对象的属性和布局的方向


metrics

在可视格式字符串中出现的约束dictionary,dictionary的key必须是NSString值,dictionary的value必须是NSNumber类型。


views

视图dictionary,dictionary的key必须是NSString值,dictionary的value必须是UIView对象。


返回值:

  约束的数组

  

  +(instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(nullable id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c

   通过定义给定视图的指定属性之间的关系创建约束

参数:

view1

约束左侧的视图


attr1

约束左侧视图的属性


relation

约束左侧和右侧视图的关系


view2

约束右侧的视图


attr2

约束右侧视图的属性


multiplier

乘数


c

常量值


 

  激活或停用约束

  property (getter=isActive) BOOL active

  获取一个约束的状态。默认为NO。

  

  + (void)activateConstraints:(NSArray<NSLayoutConstraint *> *)constraints

  激活指定约束数组中的所有约束。

 

  + (void)deactivateConstraints:(NSArray<NSLayoutConstraint *> *)constraints

  停用指定约束数组中的所有约束。

 

  访问约束数据

  

  @property UILayoutPriority priority

  优先级属性。如果一个约束的优先级小于UILayoutPriorityRequired,那么这个约束是可选的。先满足高优先级的约束再可满足低优先级的约束。优先级必须是大于0且小于或等于NSLayoutPriorityRequired。

  @property(readonly, assign) id firstItem

  参与约束的第一个对象。

  @property (readonly) NSLayoutAttribute firstAttribute

  第一个对象的属性。

  @property (readonly) NSLayoutRelation relation

  约束中,2个属性的关系。

  @property (nullable, readonly, assign) id secondItem

  参数约束的第二个对象。

  @property (readonly) NSLayoutAttribute secondAttribute;

  第二个对象的属性

 

  枚举,常量

  NSLayoutAttribute

  对象的可视化表示形式,用于获取该约束的值的一部分。

 

下篇介绍使用方法,本文结束