SwiftyLayout は、Swiftプログラムにおいて、レイアウト制約(NSLayoutConstraint)を簡単な数式として定義できるようにするフレームワークです。
- SwiftyLayout 3 は Swift 2 用です。
- SwiftyLayout 4 は Swift 3 用です。
「ビューAの横幅はビューBの横幅の50%から4.0引いたものと等しい」というレイアウト制約は、SwiftyLayoutフレームワークを使って:
viewA[.Width] == 0.5 * viewB[.Width] - 4.0
のように記述できます。これは以下のコードと同じレイアウト制約を生成します:
NSLayoutConstraint(
item: viewA, attribute: .Width,
relatedBy: .Equal,
toItem: viewB, attribute: .Width,
multiplier: 0.5, constant: -4.0)
また「ビューAのサイズの縦横比は 3:4 に等しい」という制約は:
viewA[.Width] * 3.0 == viewA[.Height] * 4.0
のように記述できます。これは以下のコードと同じレイアウト制約を生成します:
NSLayoutConstraint(
item: viewA, attribute: .Width,
relatedBy: .Equal,
toItem: viewA, attribute: .Height,
multiplier: 4.0/3.0, constant: 0.0)
二項演算子~
を使ってレイアウト制約の優先順位を指定することができます:
innerView[.Leading] == outerView[.Leading] + 4.0 ~ 750.0
この演算子は、レイアウト制約の優先順位を設定した上でそのレイアウト制約を返します:
var constraint = NSLayoutConstraint(
item: innerView, attribute: .Leading,
relatedBy: .Equal,
toItem: outerView, attribute: .Leading,
multiplier: 1.0, constant: 4.0)
constraint.priority = 750.0
// -> constraint
制約項(ConstraintTerm)とは、レイアウト制約の右辺または左辺で、ビューを含む項のことです。
あるビューviewA
の横幅.Width
を表す制約項は:
viewA[.Width]
と記述します。viewA
のところにはUIViewオブジェクトが、.Width
のところにはNSLayoutAttribute
型の値が入ります。
制約項は、以下のような構造体として定義されています:
public struct ConstraintTerm
{
let view: UIView?
let attribute: NSLayoutAttribute
var multiplier: CGFloat = 1.0
var constant: CGFloat = 0.0
}
以下の表で「制約項」はConstraintTerm
型の値、「定数」はCGFloat
型の値、「レイアウト制約」はNSLayoutConstraint
オブジェクトを表します。
演算子 | 左辺 | 右辺 | 評価値 | 意味 |
---|---|---|---|---|
+ | 制約項 | 定数 | 制約項 | 左辺のconstant に右辺の値を加算 |
+ | 定数 | 制約項 | 制約項 | 右辺のconstant に左辺の値を加算 |
- | 制約項 | 定数 | 制約項 | 左辺のconstant から右辺の値を減算 |
* | 制約項 | 定数 | 制約項 | 左辺のmultiplier とconstant に右辺の値を乗算 |
* | 定数 | 制約項 | 制約項 | 右辺のmultiplier とconstant に左辺の値を乗算 |
/ | 制約項 | 定数 | 制約項 | 左辺のmultiplier とconstant を右辺の値で除算 |
== | 制約項 | 制約項 | レイアウト制約 | 「左辺と右辺の値が等しい」というレイアウト制約を生成 |
== | 制約項 | 定数 | レイアウト制約 | 同上 |
== | 定数 | 制約項 | レイアウト制約 | 同上 |
<= | 制約項 | 制約項 | レイアウト制約 | 「左辺の値は右辺の値より小さいか等しい」というレイアウト制約を生成 |
<= | 制約項 | 定数 | レイアウト制約 | 同上 |
<= | 定数 | 制約項 | レイアウト制約 | 同上 |
>= | 制約項 | 制約項 | レイアウト制約 | 「左辺の値は右辺の値より大きいか等しい」というレイアウト制約を生成 |
>= | 制約項 | 定数 | レイアウト制約 | 同上 |
>= | 定数 | 制約項 | レイアウト制約 | 同上 |
~ | レイアウト制約 | 定数(Float型) | レイアウト制約 | レイアウト制約の優先度を変更して、そのレイアウト制約を返す |
- Swift 2.0 (Xcode 7 以降)
- iOS 8 以降 / iOS 7 (ソースコードを直接コピー)
- iOS
- iOS 8 以降 / iOS 7 (ソースコードを直接コピー)
- Mac
- Mac OS X 10.10 以降 / 10.9 以前での動作は不明
2種類の方法があります。
SwiftyLayout は Carthage を使うと簡単にプロジェクトに追加できます。
- Cartfile に
github "fhisa/SwiftyLayout"
の1行を追加 carthage update
を実行- Carthage/Build の中にできたフレームワークをプロジェクトに追加
- 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 対応
SwiftyLayout は MIT license の元で配布しています。