博客> Swift开发—Auto Layout-使用代码添加约束(上)
Swift开发—Auto Layout-使用代码添加约束(上)
2017-09-22 10:32 评论:0 阅读:391 ybyj1314
swift 自动布局 约束

如果要用代码添加约束,先要添加如下代码: targetView.translatesAutoresizingMaskIntoConstraints = true 这是由于苹果在iOS 6当中引入了自动布局的新概念,但在那时仍然有很多旧的代码使用autoresizingMask与setFrame:的方式构建界面。试想,如果将一个已经设置好frame并使用autoresizingMask的视图添加到一个使用自动布局的视图中时,运行时需要隐式地将前者的frame和autoresizingMask转化为自动布局约束(这些隐式转换的约束的类型为NSAutoresizingMaskLayoutConstraint),这样才能明确其位置与尺寸而不会导致约束的缺失。这个隐式转换的过程,是由UIView的translatesAutoresizingMaskIntoConstraints属性的值决定的。默认情况下,该值为YES,表示需要运行时自动进行隐式转换。这对于兼容旧的代码当然是好的,然而当我们明确为视图添加了约束后,我们就不希望再进行autoresizingMask的隐式转换了,否则就会引起约束的冲突。因此,需要特别注意的是,当我们使用代码创建视图时,需要将translatesAutoresizingMaskIntoConstraints属性的值设置为true。

在UIKit中,每一个布局约束是一个NSLayoutConstraint实例,构造函数: NSLayoutConstraint(item: AnyObject, attribute: NSLayoutAttribute, relatedBy: NSLayoutRelation, toItem: AnyObject?, attribute: NSLayoutAttribute, multiplier: CGFloat, constant: CGFloat)

其中的item与toItem分别是界面中受约束的视图与被参照的视图。他们不一定非得是兄弟关系或者父子关系,只要是他们有着共同的祖先视图即可,这一点是autoresizingMask无法做到的。 两个attribute分别是item与toItem的某个布局属性(NSLayoutAttribute):

public enum NSLayoutAttribute : Int { case Left case Right case Top case Bottom case Leading case Trailing case Width case Height case CenterX case CenterY case Baseline public static var LastBaseline: NSLayoutAttribute { get } @available(iOS 8.0, *) case FirstBaseline

@available(iOS 8.0, *)
case LeftMargin
@available(iOS 8.0, *)
case RightMargin
@available(iOS 8.0, *)
case TopMargin
@available(iOS 8.0, *)
case BottomMargin
@available(iOS 8.0, *)
case LeadingMargin
@available(iOS 8.0, *)
case TrailingMargin
@available(iOS 8.0, *)
case CenterXWithinMargins
@available(iOS 8.0, *)
case CenterYWithinMargins

case NotAnAttribute

}

每一个枚举值代表了一个布局属性。注意,item与toItem不一定非得是同样的值,允许定义诸如某视图的高度等于另一个视图的宽度这样的约束。NotAnAttribute这个额外解释一下,当我们需要为某个视图精确指定一个宽度或者高度值时,这时候toItem为nil,其attribute也为NotAnAttribute。

relation定义了布局关系(NSLayoutRelation):

public enum NSLayoutRelation : Int { case LessThanOrEqual case Equal case GreaterThanOrEqual }

布局关系可以是相等、大于等于或者小于等于。

multiplier即比例系数。constant即常量。

理论到此为止,下次写个例子试试吧。

收藏
0
sina weixin mail 回到顶部