Skip to content

noahd/SwiftAutoLayout

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SwiftAutoLayout

SwiftAutoLayout is a very small DSL for Autolayout, intended to provide a more declarative way to express layout constraints. Here's a quick example:

// this:
let constraint = view1.al_left == view2.al_right * 2.0 + 10.0
		
// is equivalent to:
let constraint = NSLayoutConstraint(item: view1, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: view2, attribute: NSLayoutAttribute.Right, multiplier: 2.0, constant: 10.0)

You may notice that this looks a lot like the linear equation that a constraint represents. From the Apple documentation:

The relationship involves a first attribute, a relationship type, and a modified second value formed by multiplying an attribute by a constant factor and then adding another constant factor to it. In other words, constraints look very much like linear equations of the following form:

attribute1 == multiplier × attribute2 + constant

SwiftAutolayout allows you to more effectively communicate the intent of a constraint by making the syntax more similar to the equation that it represents.

Attributes

Layout attributes are defined as properties added in an extension of UIView. For example, UIView.al_width and UIView.al_height represent NSLayoutAttribute.Width and NSLayoutAttribute.Height, respectively.

Relations

Relations are expressed using the overloaded operators == (NSLayoutRelation.Equal), >= (NSLayoutRelation.GreaterThanOrEqual), and <= (NSLayoutRelation.LessThanOrEqual).

If you think I'm crazy for overloading operators like == (even though it doesn't have any pre-existing behaviour with structs), you can also use plain old function calls:

// this:
let constraint = view1.al_left == view2.al_right * 2.0 + 10.0
		
// is equivalent to:
let constraint = view1.al_left.equalTo(view2.al_right * 2.0 + 10.0))

equalTo(), greaterThanOrEqualTo(), and lessThanOrEqualTo() are equivalent to ==, >=, and <=, respectively.

Tests?

####Yes.

Baby's First Swift OSS

As a sidenote, this is my first open-source Swift project! I had a lot of fun building this and am super excited about the future of the language, especially once the glaring compiler issues have been sorted out.

Contact

License

SwiftAutoLayout is licensed under the MIT License.

About

Tiny Swift DSL for Autolayout

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 100.0%