【问题标题】:UIDynamics and Device RotationUIDynamics 和设备旋转
【发布时间】:2013-09-27 20:28:09
【问题描述】:

如果我在视图中添加任何类型的UIDynamicBehavior,它会在设备旋转时完全破坏。这是纵向的(正确显示):

这里是风景,都坏了:

我不认为这是一个自动布局问题,因为如果我删除添加 UIDynamicBehavior 的调用,它可以正常工作,没有自动布局问题。也不会抛出任何自动布局错误。代码如下:

@interface SWViewController () {
  UICollisionBehavior *coll;
  UIDynamicAnimator *dynamicAnimator;
}

@implementation SWViewController
- (void)viewDidLoad {
  [super viewDidLoad];
  dynamicAnimator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self setupCollisions]; // commenting this out fixes the layout
}

- (void)setupCollisions {
  NSArray *dynamicViews = @[greenView];
  coll = [[UICollisionBehavior alloc] initWithItems:dynamicViews];    
  CGFloat topBound = CGRectGetMinY(greenView.frame);
  [coll addBoundaryWithIdentifier:@"top"
                        fromPoint:CGPointMake(0, h1)
                          toPoint:CGPointMake(CGRectGetWidth(greenView.frame), h1)];    
  [dynamicAnimator addBehavior:coll];
}

如果我覆盖didRotateFromInterfaceOrientation,我可以看到greenView 的顶部边界不符合自动布局的要求(同样,删除对setupCollisions 的调用可以解决此问题)。

greenView 上的自动布局边界是:

height = 200
trailing space to Superview = 0
leading space to Superview = 0
bottom space to Superview = 0

【问题讨论】:

  • 嗨,我看到你在这里使用了碰撞行为。如果没有重力行为,这会做什么?谢谢。
  • 在这个例子中,我什至没有使用重力行为。如果我把它关掉,它会做同样的事情。
  • 我强烈建议您观看有关该主题的 WWDC 视频。从今年开始的第 206 和 221 届会议。 developer.apple.com/wwdc/videos 如果你有关于 SO 的问题,请创建自己的问题。

标签: ios7 autolayout uikit-dynamics uicollisionbehavior uidynamicbehavior


【解决方案1】:

我发现的一个解决方案是覆盖willRotateToInterfaceOrientation: 并删除UIDynamicItems,然后在didRotateFromInterfaceOrientation: 中重新添加它们。这让我觉得相当 hacky,一旦我添加更复杂的行为,可能会引入错误。

【讨论】:

  • 我真的不买这个作为这个问题的答案,因为通过将行为重新应用到动画师,动画会重复自己,并且在每次旋转时都这样做......不优雅。
  • 我希望看到更好的(请)!因为是的,我必须跟踪事物的状态并仔细重新应用行为,这样动画就不会卡顿和重复。
  • 我已经有一段时间没有重新审视这个问题了,但我认为 iOS 8 在处理这个问题方面没有提供任何新的东西。
【解决方案2】:

动态动画师正在更改相关视图的帧。因此,调用-[UIView setNeedsLayout] 会干扰任何动画(无论动态动画状态如何,视图都会被置于约束驱动的位置。

我的观察是您使用自动生成的布局约束,动态动画师会将它们从动画中涉及的任何视图中删除。

如果您添加自己的布局约束 - 它们会持续存在 - 但会在要求视图重新计算布局时干扰您的动画。

【讨论】:

    【解决方案3】:

    请仔细检查您的自动布局约束。

    我有一个非常相似的问题:

    就我而言,我有一个子视图 MyView,它有一组约束:V:|-(0)-[MyView], V:[MyView]-(0)-|, H:[MyView: (==300)],并且在没有 UIDynamics 的情况下效果很好。但是在MyView中加入UIDynamics后,在旋转的过程中宽度发生了变化,这和你的问题很相似。

    我通过添加一个约束来修复它:H:|-(0)-[MyView]

    【讨论】:

      猜你喜欢
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多