如果我在视图中添加任何类型的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
的顶部边界不符合autolayout所说的那样(再次,删除对setupCollisions
的调用会修复此问题。)< / p>
greenView
上的自动布局边界为:
height = 200
trailing space to Superview = 0
leading space to Superview = 0
bottom space to Superview = 0
答案 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]