【发布时间】:2019-06-24 22:40:28
【问题描述】:
我有一个带有两个约束的 UILabel。我激活的约束之一和我禁用的另一个约束。我有一个按钮可以禁用第一个约束并激活第二个约束。然后当第二次点击时,禁用第二个约束并重新激活第一个约束。第一次点击此按钮按预期工作。 UILabel 包括所有其他 UILabel 约束到它,移动到不同的位置。但是,当点击按钮将其移回时,布局会中断。 UILabel 移动到几乎与之前相同的位置,但所有其他 UILabel 都被限制在原地不动,不会回到原来的位置。
这是处理激活约束的函数。
- (void)tapOnce:(UIGestureRecognizer *)gesture
{
if (_constraintLabelOne.isActive) {
[_constraintLabelOne setActive:NO];
[_constraintLabelTwo setActive:YES];
} else {
[_constraintLabelTwo setActive:NO];
[_constraintLabelOne setActive:YES];
}
[self layoutIfNeeded];
}
约束看起来像这样。
_constraintLabelOne = [NSLayoutConstraint constraintWithItem:myLabel
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:topView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:6];
_constraintLabelTwo = [NSLayoutConstraint constraintWithItem:myLabel
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:topView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:20];
在第一次调用tapOnce 后,限制为myLabel 的其他标签卡在第二个位置。 myLabel 约束更新后,它们为什么不回到初始位置?
我附上了一张带有当前行为图的屏幕截图。蓝色框代表topView。洋红色框代表myLabel。第一个屏幕是在调用tapOnce 之前。中间的屏幕是在拨打tapOnce 一次之后。右侧画面是调用tapOnce 两次之后。
【问题讨论】:
-
期望的行为是什么?
-
第二次调用
tapOnce后,所需的行为是屏幕看起来像最左边的样子。布局不应看起来像最右边的屏幕。 -
抱歉,我以为最左边的屏幕是起点。您说“第一个屏幕是在调用 tapOnce 之前”。如果不是,您第一次拨打
tapOnce之前的屏幕是什么样的?您能否展示tapOnce的效果应该是什么,即之前和之后?或者你是说一次点击会使我们从第一个屏幕转到第二个屏幕,而第二次点击应该使我们从第二个屏幕回到第一个屏幕? -
我是说想要的效果是,一次点击使我们从第一个屏幕转到第二个屏幕,第二次点击应该使我们从第二个屏幕回到第一个屏幕。跨度>
标签: ios objective-c nslayoutconstraint