addSubviewした時に親Viewに対して上下左右くっつけたい
単にaddSubviewするだけだと、端末を回転させたりすると崩れたりする。
なので、親のViewに上下左右くっつけるようなやつが欲しい。
extensionでなんとかしてみた
2019/08/31更新:
iOS9以上だとNSLayoutAnchor
を使った方がわかりやすいです。
extension UIView {
func addAndFit(subview:UIView) {
// Autosizingからの変換を無効にする
subview.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
subview.leftAnchor.constraint(equalTo: leftAnchor),
subview.rightAnchor.constraint(equalTo: rightAnchor),
subview.topAnchor.constraint(equalTo: topAnchor),
subview.bottomAnchor.constraint(equalTo: bottomAnchor)
])
}
}
ここから以下はiOS9以前の内容です。
extension UIView {
func addAndFit(subview:UIView) {
subview.translatesAutoresizingMaskIntoConstraints = false
addConstraints([
NSLayoutConstraint(
item: subview,
attribute: .left,
relatedBy: .equal,
toItem: self,
attribute: .left,
multiplier: 1.0,
constant: 0
),
NSLayoutConstraint(
item: subview,
attribute: .top,
relatedBy: .equal,
toItem: self,
attribute: .top,
multiplier: 1.0,
constant: 0
),
NSLayoutConstraint(
item: subview,
attribute: .right,
relatedBy: .equal,
toItem: self,
attribute: .right,
multiplier: 1.0,
constant: 0
),
NSLayoutConstraint(
item: subview,
attribute: .bottom,
relatedBy: .equal,
toItem: self,
attribute: .bottom,
multiplier: 1.0,
constant: 0
)]
)
}
}
VisualFormatを使うと、より簡単に書けるようです。 ( rizumitaさんよりコメントを頂きました )
extension UIView {
func addAndFit(subview:UIView) {
// Autosizingからの変換を無効にする (trueだとAutoLayoutが正常に設定できない)
subview.translatesAutoresizingMaskIntoConstraints = false
addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:|[subview]|",
options: .init(rawValue: 0),
metrics: nil,
views: ["subview" : subview]
)
)
addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[subview]|",
options: .init(rawValue: 0),
metrics: nil,
views: ["subview" : subview]
)
)
}
}
関連記事
Protocol Extensionを使って利用制約をかけつつmapを使ってより短く書く方法が書かれています。
また、コメント欄にもautoresizingMaskからAuto Layoutへの変換で実現するやり方もコメントに書かれています。