2017-09-15 72 views
0

我创建了自己的UITabBar(只是一个UIView实例)的实现。Autolayout:旋转后的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会自动更新。为什么这一帧没有正确更新?

+0

@matt你看到最后一张截图吗?它来自视图调试器。而'NSLayoutConstraint'的打印输出是高亮约束的描述。 – mbm29414

+0

@matt是的。最后的截图来自视图调试器。 “NSLayoutConstraint”的打印输出来自视图调试器。他们不匹配。它显示了一个正确配置的约束,但是该框架对于约束的设置不正确。我不确定你还有什么其他建议。 – mbm29414

+0

@matt我甚至改变了它,并删除了我上面显示的NSLayoutConstraint,用一个约束将视图对齐到它的超级视图的中心,向右偏移一个静态数量(它将它放置在相同的位置地点)。发生同样的问题。查看调试器仍然显示徽章的正确设置。难道是因为这个'UIView'子类有自己的'drawRect:'方法吗?我想不出其他任何与这种观点不同的东西。 – mbm29414

回答

0

因此,首先我研究了自定义drawRect:方法是否可能是我的问题的原因。这似乎并不是一个因素。然后,我开始注意到视图在不同时间的框架之间存在一些奇怪的差异,以及这个特定的(实际上有3个)应用程序出现问题的方式。其他2个当前没有显示值。

然后,我记得我使用一个UIDynamicAnimator时,值改变为“反弹”的观点,以注意新的价值。

所以,问题实际上是当我完成动画时,我没有“释放”(在控制意义上,而不是记忆意义上)来自UIDynamicAnimator的视图。 (我仍然不确定这是否是一个错误,在我看来,如果动画暂停,并且约束条件应该更新视图的帧,那么也许应该发生。)

所以,这里是实际的代码这是“车”:

- (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的问题。)