UIDynamics和设备轮换

时间:2013-09-27 20:28:10

标签: ios7 autolayout uikit-dynamics uicollisionbehavior uidynamicbehavior

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

Correct Layout

这里是风景,所有人都破了:Broken layout

我不相信这是一个自动布局问题,因为如果我删除添加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的顶部边界不符合autolayout所说的那样(再次,删除对setupCollisions的调用会修复此问题。)< / p>

greenView上的自动布局边界为:

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

3 个答案:

答案 0 :(得分:2)

我找到的一个解决方案是覆盖willRotateToInterfaceOrientation:并移除UIDynamicItems,然后在didRotateFromInterfaceOrientation:中重新添​​加它们。这让我感到非常苛刻,并且一旦我添加了更复杂的行为,就可能会引入错误。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

请仔细检查您的自动布局限制。

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

在我的情况下,我有一个子视图,MyView,它有一组约束:V:| - (0) - [MyView],V:[MyView] - (0) - |,H:[MyView: (== 300)],它适用于UIDynamics。但是在将UIDynamics添加到MyView后,旋转期间的宽度发生了变化,这与您的问题非常相似。

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