autolayout

来源:互联网 发布:掌上电力老是网络错误 编辑:程序博客网 时间:2024/05/21 17:13

Visual Format language

VFL是一个字符串, 下面是一个横向的描述, childView横向充满superview:
“H:|-0-[childView]-0-|”
因为距离是0, 可以省略为”H:|[childView]|”
而竖向的描述,childView和dateLabel的距离为8: “V: [dateLabel]-8-[childView]-8-[dateLabel]”, 因为8是默认的距离,可以写为:”V: [dateLabel]-[childView]-[dateLabel]”
一个view的高是50: “V: [view(==50)]”

创建一个约束

约束是NSLayoutConstraint的实例,用这个函数:

NSLayoutConstraint.constraintsWithVisualFormat(format: String, options: NSLayoutFormatOptions, metrics: [String : AnyObject]?, views: [String : AnyObject])

返回一个NSLayoutConstraint的数组, 4个参数:
- format: VFL
- views: 是一个NSDictionary, 是一个virsul format字符串到view对象的map, 比如说: “H:|-0-[childView]-0-|”, 里面的childView是一个virsul format字符串,但是实际上要对应到view的对象

        let nameMap = ["childView": childView, "containerView": containerView]

添加约束

添加约束的规则:
- 如果约束影响2个view,有相同的superview,添加到superview上
- 如果约束影响1个view,添加到这个view上
- 如果约束影响2个view,没有相同的superview,但有相同的祖先,那么添加到第一个相同的祖先上
- 如果约束影响一个view和它的superview,添加到superview上

Intrinsic(固有的) Content Size

Intrinsic(固有的) Content Size决定了一个view的大小,比如,一个label的Intrinsic(固有的) Content Size基于它显示的字,而image view的Intrinsic(固有的) Content Size决定于图片的大小。auto layout用这个信息来创建Intrinsic(固有的) Content Size 约束。这些创建的约束有2个属性: content hugging优先级,content压缩阻力优先级。如果hugging优先级是1000表示view不容许变的比Intrinsic(固有的) Content Size更大。如果小于1000, 那么view的size可以增加。而压缩阻力优先级如果是1000表示view不容许变的比Intrinsic(固有的) Content Size更小。如果小于1000, 那么view的size可以变小。这2个优先级都分别有高和宽。可以通过下列函数设置:

setContentHuggingPriority(UILayoutPriority, forAxis: UILayoutConstraintAxis)

另外的创建约束的方法

        NSLayoutConstraint(item: AnyObject, attribute: NSLayoutAttribute, relatedBy: NSLayoutRelation, toItem: AnyObject?, attribute: NSLayoutAttribute, multiplier: CGFloat, constant: CGFloat)
  • NSLayoutAttribute: 值有以下这些
case Left    case Right    case Top    case Bottom    case Leading    case Trailing    case Width    case Height    case CenterX    case CenterY    case Baseline

比如: 你想要一个image view的宽是长的1.5倍,可以这样写:

   NSLayoutConstraint(item: image, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: image, attribute: NSLayoutAttribute.Height, multiplier: 1.5, constant: 0.0)

等于这个等式: image.width = image.height + 0.0

AutoresizeMask

在auto layout之前,iOS用autoresize masks来处理layout,每一个view有一个autoresize mask来处理view和superview的关系,但是view之间是不能用mask来处理的。但是这种方法问题很多,最好把它关掉。

image.translatesAutoresizingMaskIntoConstraints = false
0 0
原创粉丝点击