SwiftyLayout is a framework that allows to describe layout constraints (ie NSLayoutConstraint) as a simple mathematical formula in a Swift program.
- SwiftyLayout 3 for Swift 2
- SwiftyLayout 4 for Swift 3
Using the framework, a layout constraint that "the width of the view A is equal to minus 4.0 to 50% of the width of the Views B" follows:
viewA[.Width] == 0.5 * viewB[.Width] - 4.0
This is the same layout constraints with the following code:
NSLayoutConstraint(
item: viewA, attribute: .Width,
relatedBy: .Equal,
toItem: viewB, attribute: .Width,
multiplier: 0.5, constant: -4.0)
A layout constraint that "the aspect ratio of the view A is 3:4" follows:
viewA[.Width] * 3.0 == viewA[.Height] * 4.0
This is the same layout constraints with the following code:
NSLayoutConstraint(
item: viewA, attribute: .Width,
relatedBy: .Equal,
toItem: viewA, attribute: .Height,
multiplier: 4.0/3.0, constant: 0.0)
The framework has priority specification operator ~
like the following.
innerView[.Leading] == outerView[.Leading] + 4.0 ~ 750.0
This is the same layout constraints with the following code:
var constraint = NSLayoutConstraint(
item: innerView, attribute: .Leading,
relatedBy: .Equal,
toItem: outerView, attribute: .Leading,
multiplier: 1.0, constant: 4.0)
constraint.priority = 750.0
// -> constraint
Please refer to the code for the sample application and test case, too.
ConstraintTerm means a term that contains a view in the right side or the left side of a layout constraint.
For example, a ConstraintTerm representing the width .Width
of view viewA
:
viewA[.Width]
viewA
is a UIView instance object, .Width
is a NSLayoutAttribute
value.
ConstraintTerm is defined as a structure such as the following:
public struct ConstraintTerm
{
let view: UIView?
let attribute: NSLayoutAttribute
var multiplier: CGFloat = 1.0
var constant: CGFloat = 0.0
}
The following table, CONSTANT means CGFloat value
operator | lhs | rhs | value | semantics |
---|---|---|---|---|
+ | ConstraintTerm | CONSTANT | ConstraintTerm | add rhs value to lhs.constant |
+ | CONSTANT | ConstraintTerm | ConstraintTerm | add lhs value to rhs.constant |
- | ConstraintTerm | CONSTANT | ConstraintTerm | subtract rhs value from lhs.constant |
* | ConstraintTerm | CONSTANT | ConstraintTerm | multiply rhs value to lhs.multiplier and lhs.constant |
* | CONSTANT | ConstraintTerm | ConstraintTerm | multiply lhs value to rhs.multiplier and rhs.constant |
/ | ConstraintTerm | CONSTANT | ConstraintTerm | divide lhs.multiplier and lhs.constant by rhs value |
== | ConstraintTerm | ConstraintTerm | NSLayoutConstraint | create a layout constraint that "lhs is equal to lhs" |
== | ConstraintTerm | CONSTANT | NSLayoutConstraint | ditto |
== | CONSTANT | ConstraintTerm | NSLayoutConstraint | ditto |
<= | ConstraintTerm | ConstraintTerm | NSLayoutConstraint | create a layout constraint that "lhs is less than or equal to lhs" |
<= | ConstraintTerm | CONSTANT | NSLayoutConstraint | ditto |
<= | CONSTANT | ConstraintTerm | NSLayoutConstraint | ditto |
>= | ConstraintTerm | ConstraintTerm | NSLayoutConstraint | create a layout constraint that "lhs is greater than or equal to lhs" |
>= | ConstraintTerm | CONSTANT | NSLayoutConstraint | ditto |
>= | CONSTANT | ConstraintTerm | NSLayoutConstraint | ditto |
~ | NSLayoutConstraint | CONSTANT(Float) | NSLayoutConstraint | Change the priority of a layout constraint, and return the constraint |
- Swift 2.0 (Xcode 7 or later)
- iOS
- iOS 8 or later / iOS 7 (by coping the source files directly)
- Mac
- Mac OS X 10.10 or later
There are two options.
Using Carthage, it's easy to add SwiftyLayout to the project.
- Add
github "fhisa/SwiftyLayout"
to your Cartfile. - Run
carthage update
- Add SwiftyLayout.framework in Carthage/Build/iOS to your Xcode project.
- Add this repository as a git submodule:
$ git submodule add https://github.com/fhisa/SwiftyLayout.git PATH_TO_SUBMODULE
// or
$ carthage update --use-submodules
- Then just add references of SwiftyLayout/*.swift to your Xcode project.
- CocoaPods support
SwiftyLayout is released under the MIT license.