The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

AutolayoutでレイアウトしたViewを外して元に戻す

InterfaceBuilderやStoryboardでAutolayoutを使って配置したViewをremoveFromSuperviewしてから、 再度addSubviewしたい!ということがたまにあります。

普通にremoveFromSuperviewしてaddSubviewすると元には戻りません。 なぜならremoveFromSuperviewした時点で親と消された子のViewのAutolayoutの制約は消えてしまうからです。

どうすればよいかというremoveFromSuperviewする前に制約をどこかに保存しておき、 addSubview後にそれらの制約を追加すればよいです。

view以下にbuttonが配置されていたのを取ったりつけたりする場合です。

private var buttonConstraints = [NSLayoutConstraint]()

...

// removeFromSuperviewするとき
view.constraints.forEach {
    if $0.firstItem is UIButton || $0.secondItem is UIButton {
        self.buttonConstraints.append($0)
    }
}
button.removeFromSuperview()

...
// addSubviewするとき
view.addSubview(button)
buttonConstraints.forEach {
    view.addConstraint($0)
}