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) }