Cartography-Swift的自动布局第三方库(官方文档翻译)

前端之家收集整理的这篇文章主要介绍了Cartography-Swift的自动布局第三方库(官方文档翻译)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

源地址:https://github.com/robb/Cartography


使用Cartography,你可以抛开链式语法,使用声明式的代码设置你的自动布局约束!

简而言之,他可以让你将如下的代码

  1. addConstraint(NSLayoutConstraint(
  2. item: button1,attribute: .Right,relatedBy: .Equal,toItem: button2,attribute: .Left,multiplier: 1.0,constant: -12.0
  3. ))

替换为以下的代码

  1. layout(button1,button2){ button1,button2 in
  2. button1.right == button2.left - 12

如果你在使用Cartography的过程中遇到困难,可以联系作者 [Twitter] 或者 [email] .

用法


调用layout方法,传入UIViewNSView类型实例,在闭包中声明各个视图的不同属性之间的约束:

  1. layout(view1,view2) { view1,view2 in
  2. view1.width == (view1.superview!.width - 50) * 0.5
  3. view2.width == view1.width - 50
  4. view1.height == 40
  5. view2.height == view1.height
  6. view1.centerX == view1.superview!.centerX
  7. view2.centerX == view1.centerX
  8.  
  9. view1.top >= view1.superview!.top + 20
  10. view2.top == view1.bottom + 20
  11. }

对于每个等式或不等式左边的view,Cartography会自动将其translatesAutoresizingMaskIntoConstraints属性设置为false。如果这个view不是受你控制的----比如它是属于一个苹果提供的UIViewController类----你需要在声明约束时对其保持适当的关注。

要注意的是,layout在必要的情况下会对自动对视图进行重新布局。如果你想要自己控制这个布局的步骤的话,你可以用constrain方法来代替它:

  1. constrain(view1) { view1 in
  2. view1.width == 100
  3. view1.height == 100
  4. view1.center == view.superview!.center
  5. }
  6.  
  7. UIView.animateWithDuration(0.5,animations: view1.layoutIfNeeded)

约束的替换


你可以获取一个约束组(group)内的多种约束,随后用新的一些约束来替换它们。

  1. constrain(view) { view in
  2. view.width == 100
  3. view.height == 100
  4. }
  5.  
  6. // 获取约束组
  7. let group = ConstraintGroup()
  8.  
  9. // 使'view'关联到它的父视图的左上角
  10. constrain(view,replace: group) { view in
  11. view.top == view.superview!.top
  12. view.left == view.superview!.left
  13. }
  14.  
  15. /* 之后 */
  16.  
  17. // 将这个view移动到它的父视图的右下角
  18. constrain(view,replace: group) { view in
  19. view.bottom == view.superview!.bottom
  20. view.right == view.superview!.right
  21. }
  22.  
  23. UIView.animateWithDuration(0.5,animations: view.layoutIfNeeded)

为了方便起见,layoutconstrain方法都会返回ConstraintGroup实例:

  1. let group = layout(button) { button in
  2. button.width == 100
  3. button.height == 400
  4. }

支持属性


Cartography支持所有iOS 8和 OS X 10.9内置的属性,如下:

  • width

  • height

  • top

  • right

  • bottom

  • left

  • leading

  • trailing

  • centerX

  • centerY

  • baseline

以及iOS的特性

  • firstBaseline

  • leftMargin

  • rightMargin

  • topMargin

  • bottomMargin

  • leadingMargin

  • trailingMargin

  • centerXWithinMargins

  • centerYWithinMargins

  • edgesWithinMargins

这些属性都可以通过以下运算符来进一步细化:*,/,+ and
-

此外,它提供了一种方便的方法支持复合属性的设置,因此你可以一次分配多个属性

  1. layout(view) { view in
  2. view.size == view.superview!.size / 2
  3. view.center == view.superview!.center
  4. }
  1. layout(view) { view in
  2. view.edges == inset(view.superview!.edges,20,40,20)
  3. }

多个视图对齐

如果你需要让多个视图对齐一个共有的边缘,你可以使用align方法

  1. layout(view1,view2,view3) { view1,view3 in
  2. align(top: view1,view3)
  3. }

这相当于view1.top == view2.top; view2.top == view3.top。 还可以对top,right bottom,left,leading,trailing,
centerX,centerYbaseline进行相似的设置.

视图均匀分布

为了让视图均匀分布,无论是水平的还是垂直的,我们都可以调用distribute 函数:

  1. layout(view1,view3 in
  2. distribute(by: 10,horizontally: view1,view3)
  3. }

这相当于 view1.trailing == view2.leading - 10; view2.trailing == view3.leading - 10.

设置优先级


你可以通过~操作符来设置约束的优先级:

  1. layout(view) { view in
  2. view.width >= 200 ~ 100
  3. view.height >= 200 ~ 100
  4. }

获取约束


由于==,>=,<=~ 生成NSLayoutConstraint 实例,如果你在之后需要用到生成的结果的话,你可以用如下的方法获取它:

  1. var width: NSLayoutConstraint?
  2.  
  3. layout(view) { view in
  4. width = (view.width == 200 ~ 100)
  5. }

要注意的是,复合属性的声明一次返回多个约束:

  1. var constraints: [NSLayoutConstraint]?
  2.  
  3. layout(view) { view in
  4. constraints = (view.size == view.superview!.size ~ 100)
  5. }

文档


这里可以查看文档。 更多的信息可以在gh-pages 查看。

支持


如果你有疑问的话,别犹豫,直接提交

关于Cartography


Cartography由Robb Böhnke创建并受Florian Kugler的[FLKAutoLayout]项目启发。

猜你在找的Swift相关文章