声明 Swift 中的 Auto Layout:Cartography

jopen 9年前

Cartography 是用来声明 Swift 中的 Auto Layout,无需输入任何 stringly 就可设置自己 Auto Layout 的约束声明。
声明 Swift 中的 Auto Layout:Cartography

How to use

Call the layout function with your UIView or NSView instances as well as a closure in which you declare the constraints between the different attributes of your views:

layout(view1, view2) { view1, view2 in      view1.width   == (view.superview!.width - 50) * 0.5      view2.width   == view1.width - 50      view1.height  == 40      view2.height  == view1.height      view1.centerX == view.superview!.centerX      view2.centerX == view1.centerX        view1.top >= view.superview!.top + 20      view2.top == view1.bottom + 20  }

Supported attributes

Cartography supports all built-in attributes as of iOS 7 and OS X 10.9, those are: width, height, top, right bottom, left, leading, trailing,centerX, centerY and baseline. These can be further refined using the following operators: *, /, + and -.

Additionally, it supports convenient compound attributes that allow you to assign multiple attributes at once:

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

Setting priorities

You can set the priorities of your constraints using the ~ operator:

layout(view) { view in      view.width  >= 200 ~ 100      view.height >= 200 ~ 100  }

Capturing constraints

Since the ==, >=, <= and ~ emit NSLayoutConstraint instances, you can capture their results if you need to refer to the layout constraints at a later time:

var width: NSLayoutConstraint?    layout(view) { view in      width = (view.width == 200 ~ 100)  }

Note that declaring compound attributes returns multiple constraints at once:

var constraints: NSLayoutConstraint[]?    layout(view) { view in      constraints = (view.size == view.superview!.size ~ 100)  }
来自:http://www.iteye.com/news/29583

项目主页:http://www.open-open.com/lib/view/home/1413941476247