Ios7 UID动力学和设备旋转
如果我在视图中添加任何类型的Ios7 UID动力学和设备旋转,ios7,autolayout,uikit-dynamics,uicollisionbehavior,uidynamicbehavior,Ios7,Autolayout,Uikit Dynamics,Uicollisionbehavior,Uidynamicbehavior,如果我在视图中添加任何类型的UIDynamicBehavior,当设备旋转时,它会完全破坏一切。下面是它在肖像中的内容(正确显示): 这里是风景,一切都破碎了: 我不认为这是一个自动布局问题,因为如果我删除添加UIDynamicBehavior的调用,它就可以正常工作,不会出现自动布局问题。也不会引发自动布局错误。代码如下: @interface SWViewController () { UICollisionBehavior *coll; UIDynamicAnimator *dy
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
的调用可以解决这一问题)
greenView
上的自动布局边界为:
height = 200
trailing space to Superview = 0
leading space to Superview = 0
bottom space to Superview = 0
我找到的一个解决方案是重写
willRotateToInterfaceOrientation:
并删除UIDynamicItems
,然后将它们重新添加到didRotateFromInterfaceOrientation:
。这给我的印象是相当粗糙,一旦我添加了更复杂的行为,可能会引入bug。Dynamic animator正在更改相关视图的帧。因此,调用-[UIView setNeedsLayout]
会干扰任何动画(无论动态动画状态如何,视图都会置于约束驱动的位置)
我的观察是,如果使用自动生成的布局约束,动态动画制作者将从动画中涉及的任何视图中删除它们
如果您添加了自己的布局约束(它们仍然存在),但当视图被要求重新计算布局时,可能会干扰动画。请仔细检查您的自动布局约束 我有一个非常类似的问题: 在我的例子中,我有一个子视图MyView,它有一组约束:V:|-(0)-[MyView],V:[MyView]-(0)-|,H:[MyView:(==300)],在没有UIDynamics的情况下效果很好。但是在将UIDynamics添加到MyView之后,宽度在旋转过程中发生了变化,这与您的问题非常类似
我通过再添加一个约束来修复它:H:|-(0)-[MyView]您好,我看到您在这里使用了碰撞行为。没有重力行为,这有什么用?谢谢。在这个例子中,我甚至没有使用重力行为。如果我将其切换,它也会做同样的事情。我强烈建议您观看WWDC关于该主题的视频。今年的第206和221课时。请创建您自己的问题,如果您需要的话拥有它们。我并不真的认为这是解决这个问题的答案,因为通过对动画师重新应用该行为,动画会自动重复,并且在每次旋转时都会这样做……不优雅。我希望看到更好的(请)!因为是的,我必须跟踪事情的状态并仔细地重新应用行为,这样动画就不会口吃和重复。我已经有一段时间没有重新讨论过这个问题了,但我不相信iOS 8在处理这个问题方面提供了任何新的东西。