我的应用有视图A是视图B的超视图,并且设置视图B宽度的约束是视图A宽度的三分之一。在视图B的类中,我在方法
中编写代码-(void)updateConstraints {
//set the constraints of the width of view B is one-third of view A's width
}
在View A的类中,我重写了方法
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[viewB setNeedsUpdateConstraints]
[viewB updateConstraintsIfNeeded];
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
进行旋转时,视图B的类中的方法 updateConstraints 被调用,但视图A的宽度仍然是旧值。
我的期望值是旋转屏幕后视图A宽度的新值。
它导致视图宽度B的约束是错误的,因为它取决于视图A宽度的旧值。
我有两个问题如下:
如何在旋转屏幕后获取宽度/高度的更新值?
- 醇>
根据Apple文档,当调用[viewA updateConstraintsIfNeeded]时,它将更新自身的约束和其所有子视图。
但实际上,方法 updateConstraints - 类A的子视图 - 不被调用。我不知道为什么?
答案 0 :(得分:0)
该方法称为view Will TransitionToSize:,这意味着旋转尚未发生。任何帧值都将是该点的旧大小。你可以存储传入大小的值并使用它,因为那将是最终的大小。 updateConstraints应该在轮换期间自然调用,所以你不应该强制它,特别是不要自己调用updateConstraintsIfNeeded。
但是......如果您尝试使用视图的帧宽作为计算约束值的一部分,那么您已经偏离了轨道。约束的整个点是它们的等式的解将导致所有视图的帧;您不能使用该等式的答案来配置方程式。您将永远使用旧值,因为必须在计算帧之前设置约束。屏幕上的所有视图都是同时计算的;大多数每次尝试使用任何帧值来设置约束时,最终都会遇到问题。偶尔你会很幸运,但不推荐。
但是,应该很容易为所需的关系设置一次约束(视图B是视图A的宽度的1/3),而不是以编程方式执行任何其他操作。只需设置一个约束,两个宽度相等,乘数为1/3。
[viewB.widthAnchor constraintEqualToAnchor:viewA.widthAnchor multiplier:1.0/3.0].active = YES;
您也可以在IB中轻松完成;只需将viewB的约束添加到等于superview的宽度,然后编辑约束以添加&#34; 1/3&#34;作为乘数。这应该实现没有代码的目标。