Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios7 UID动力学和设备旋转_Ios7_Autolayout_Uikit Dynamics_Uicollisionbehavior_Uidynamicbehavior - Fatal编程技术网

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在处理这个问题方面提供了任何新的东西。