首先,确保您的等宽约束设置如下:
A.width == B.width
A.width == C.width
而不是这样的:
A.width == B.width
C.width == B.width
也就是说,确保视图B只涉及一个等宽约束。
接下来,将出口连接到视图 B 和视图 B 上的等宽约束。
@property (nonatomic, strong) IBOutlet UIView *viewB;
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *bEqualWidthConstraint;
要连接约束出口,您需要在情节提要大纲中找到约束。这将是对 A 和 B 最近共同祖先的约束之一;它不会直接在 A 或 B 上。当您在故事板大纲中找到它时,您可以从它控制拖动到源代码中的插座(或者您可以通过控制拖动到@interface 中的任何位置来创建一个新插座)。
添加另一个属性来保持另一个约束,将 B 的宽度设置为零:
@property (nonatomic, strong) NSLayoutConstraint *bZeroWidthConstraint;
初始化bZeroWidthConstraint但不要安装它:
- (void)viewDidLoad {
[super viewDidLoad];
self.bZeroWidthConstraint = [NSLayoutConstraint
constraintWithItem:self.viewB attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil attribute:NSLayoutAttributeNotAnAttribute
multiplier:0 constant:0];
}
当你想隐藏视图B时,卸载bEqualWidthConstraint并安装bZeroWidthConstraint。
在 iOS 8.0 上,您可以通过将其 active 属性设置为 NO 来卸载约束,但在早期版本中,您必须向安装了约束的视图发送消息。这通常是受约束视图的最近共同祖先。假设A和B的共同祖先是viewB.superview:
- (void)hideB {
[self.viewB.superview removeConstraint:self.bEqualWidthConstraint];
[self.viewB addConstraint:self.bZeroWidthConstraint];
}
注意,由于bZeroWidthConstraint只约束视图B,所以可以直接安装在视图B上。
当你想再次显示视图B时,卸载bZeroWidthConstraint并重新安装bEqualWidthConstraint:
- (void)showB {
[self.viewB removeConstraint:self.bZeroWidthConstraint];
[self.viewB.superview addConstraint:self.bEqualWidthConstraint];
}