Ответ 1
Нет быстрого пути.
Я сделал это с циклом над ограничениями супервизора.
Objective-C
+ (void)copyConstraintsFromView:(UIView *)sourceView toView:(UIView *)destView
{
for (NSLayoutConstraint *constraint in sourceView.superview.constraints) {
if (constraint.firstItem == sourceView)
{
[sourceView.superview addConstraint:[NSLayoutConstraint constraintWithItem:destView attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:constraint.secondItem attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant]];
}
else if (constraint.secondItem == sourceView)
{
[sourceView.superview addConstraint:[NSLayoutConstraint constraintWithItem:constraint.firstItem attribute:constraint.firstAttribute relatedBy:constraint.relation toItem:destView attribute:constraint.secondAttribute multiplier:constraint.multiplier constant:constraint.constant]];
}
}
}
Swift
static func copyConstraints(fromView sourceView: UIView, toView destView: UIView) {
guard let sourceViewSuperview = sourceView.superview else {
return
}
for constraint in sourceViewSuperview.constraints {
if constraint.firstItem as? UIView == sourceView {
sourceViewSuperview.addConstraint(NSLayoutConstraint(item: destView, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: constraint.secondItem, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant))
} else if constraint.secondItem as? UIView == sourceView {
sourceViewSuperview.addConstraint(NSLayoutConstraint(item: constraint.firstItem, attribute: constraint.firstAttribute, relatedBy: constraint.relation, toItem: destView, attribute: constraint.secondAttribute, multiplier: constraint.multiplier, constant: constraint.constant))
}
}
}
Примечание
Не забывайте копировать ограничения только после добавления destView в иерархию представления.