首页 文章

如何在旋转屏幕后获得宽度和高度的更新值?

提问于
浏览
1

我的应用程序有视图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的宽度 the old value .

我有两个问题如下:

如何在旋转屏幕后获得宽度/高度的更新值?根据Apple文档,当调用[viewA updateConstraintsIfNeeded]时,它将更新自身及其所有子视图的约束 . 但事实上,viewB'class中的方法updateConstraints - 类A的子视图 - 没有被调用 . 我不知道为什么?

1 回答

  • 0

    该方法称为viewWillTransitionToSize:,这意味着旋转不需要强制它,特别是不要自己调用updateConstraintsIfNeeded .

    但是......如果您尝试使用视图的帧宽作为计算约束值的一部分,则您已经偏离了轨道 . 约束的整个点是它们的等式的解将导致所有视图的帧;您不能使用该等式的答案来配置方程式 . 您将永远使用旧值,因为必须在计算帧之前设置约束 . 屏幕上的所有视图都是同时计算的;大多数每次尝试使用任何帧值来设置约束时,最终都会遇到问题 . 偶尔你会很幸运,但不建议这样做 .

    但是,应该很容易为所需的关系设置一次约束(视图B是视图A的宽度的1/3),而不是以编程方式执行任何其他操作 . 只需设置一个约束,两个宽度相等,乘数为1/3 .

    [viewB.widthAnchor constraintEqualToAnchor:viewA.widthAnchor multiplier:1.0/3.0].active = YES;

    您也可以在IB中轻松完成;只需将viewB的约束添加到等于superview的宽度,然后编辑约束以添加“1/3”作为乘数 . 这应该实现没有代码的目标 .

相关问题