Autolayout:旋转后UIView帧错误

时间:2017-09-15 19:42:59

标签: ios rotation autolayout

我创建了自己的UITabBar实现(只是一个UIView实例)。

UIView包含3个TabBarItem个实例。 TabBarItemUIView子类,每个子类都包含以下UI控件:

  • UIImageView
  • UILabel
  • TabBarBadge(自定义UIView子类)

我正在使用自动布局在故事板中布置视图层次结构。

标签栏项目的徽章应该定位,以便徽章的y中心与图像视图的上边缘对齐,并且应该与图像视图的右侧对齐,并且4点重叠(因此,徽章的左边缘与图像视图的右边缘对齐,常数为-4)。

无论是纵向模式还是横向模式,这都可以在应用加载时正常工作。但在任何一种情况下,旋转设备后旋转设备最终都会在旋转完成后将徽章的框架放在错误的位置。

这是来自问题NSLayoutConstraint的控制台的打印输出:

<NSLayoutConstraint H:[UIImageView]-(-4)-[TabBarBadge] (active)>

这正是我所期望的。

这是来自TabBarBadge的控制台的打印输出(纵向模式;正确演示):

<TabBarBadge frame = (80.6667 0; 36 20); text = '67'; autoresize = RM+BM>

这是来自TabBarBadge的控制台的打印输出(横向模式;不正确的演示):

<TabBarBadge frame = (80.6667 0; 36 20); text = '67'; autoresize = RM+BM>

因此,当旋转发生时,您可以看到框架没有更改/更新。

以下是几个屏幕截图:

人像,正确显示

Portrait, Correct Display

横向,显示不正确

Landscape, Incorrect Display

约束(上述约束的打印输出来自此视图)

Constraints

所以,令我困惑的是TabBarItem的其余部分正在更新。 UIImageViewUILabel会自动正确更新。为什么这一帧没有正确更新?

1 个答案:

答案 0 :(得分:0)

所以,首先我研究了自定义drawRect:方法是否可能导致我的问题。这似乎不是一个因素。

然后,我开始注意到视图框架在不同时间之间存在一些奇怪的差异,以及这个特定的一个(应用程序中实际有3个)是如何出现问题的。其他2当前没有显示值。

然后,我记得当值改为&#34;反弹&#34;时,我使用了UIDynamicAnimator。该观点,以引起人们对新价值的关注。

所以,问题实际上是我没有&#34;释放&#34; (在控制意义上,而不是记忆意义上)当我完成动画时UIDynamicAnimator的视图。 (我仍然不确定是否是一个错误。在我看来,如果动画暂停并且约束应该更新视图的框架,那么也许应该发生。)< / p>

所以,这里的实际代码是&#34; buggy&#34;:

- (void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator {
    // {Other code}
}

以下是修复我的问题的代码:

- (void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator {
    // {Other code}

    // Code that fixed the issue:
    [self.animator removeAllBehaviors];
}

如果我需要再次为视图设置动画,我只需要重新创建动画师,所以这似乎是最好的解决方法。

这似乎与Matt's answer here一致。 (当我提出这个问题时,我并不知道这是UIDynamicAnimator的问题。)