5

如果我在视图中添加任何类型的内容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
4

3 回答 3

2

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

于 2013-09-27T21:54:16.977 回答
0

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

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

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

于 2013-10-24T20:24:42.740 回答
0

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

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

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

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

于 2013-12-29T02:59:03.330 回答