在iOS 10中处理AutoLayout约束动画差异?

问题描述:

我注意到,在iOS 10 Beta 5(即将尝试Beta 6)中,AutoLayout约束动画行为有点不同。在iOS 10中处理AutoLayout约束动画差异?

例如,这种方法是行不通的一样,它在以前的iOS版本一样:

[view addConstraints:@[constraints...]]; 

[view setNeedsUpdateConstraints]; 
[view layoutIfNeeded]; 

[UIView animateWithDuration:... 
{ 
    /* adjust constraint here... */ 
    [view layoutIfNeeded]; // Only the adjusted constraints since previous layoutIfNeeded() call should animate change with duration. 

} completion:{ ... }]; 

...在我的测试中,最初加入addConstraints()动画在iOS的10约束与UIView animateWithDuration()块...这是迄今造成一些时髦/不良行为。

例如,设置阵列中的左/右约束(但是块中的垂直约束)导致整个视图在屏幕上以对角线方式以这种方式进行动画......这是完全不正确的。

有谁知道如何正确地为iOS 9(及以下),以及10做到这一点?

+1

这可能不是有关您的问题,但似乎是与各地的动画为iOS 10个问题。但是,iOS 9和10的语法应该保持不变。问题必须来自iOS 10的新动画对象。 https://forums.developer.apple.com/thread/53602 https://openradar.appspot.com/27679031 – cnotethegr8

+0

我能够解决它的问题,但它并不理想:\ –

+0

您的问题与tableview高度偏移?因为我刚刚为它创建了一个修复程序。如果不是,我的修补程序可能会帮助您,但它涉及从层级应用动画。让我知道,我会把它放在一个答案。 – cnotethegr8

尝试在视图的超级视图上调用layoutIfNeeded,而不是视图本身。

-

我有类似的问题,我的观点是应该在一个0高度从顶部进行动画,向下到> 0高度(即(0,0,320,0)到(0 ,0,320,44))。

在iOS 10中使用Xcode 8时,动画行为有很大的不同。而不是从顶部向下动画,视图从目标框架的垂直中心向下动画&。

我解决了这个问题,而不是在视图本身上调用layoutIfNeeded,在视图的超级视图上调用它。不知何故,行为已被恢复。

希望它有帮助!通过@Ramiro


帮助的注释:

根据该文件,layoutIfNeeded勾画出子视图(但不考虑当前视图本身)。所以,为了更新当前的视图布局,您需要从超级视图调用layoutIfNeeded

+0

嗯。我可以尝试一下。根据您的测试,这是否也可以在iOS 9中正常运行? –

+0

嗯,你说得对。似乎这是解决方案!即使在iOS 9中适合我。 –

+0

太棒了,很高兴帮助!行为是不同的,这很奇怪。类似的东西可能适用于表格视图单元格问题的人,尽管我还没有尝试过 – beebcon

我做了一个小测试改变一个红色的小鉴于H和V:

self.red_POS_H = NSLayoutConstraint.constraints(withVisualFormat: "H:|-90-[redView]", options: defaultOptions, metrics: nil, views: viewsDictionary) 


self.red_POS_V = NSLayoutConstraint.constraints(withVisualFormat: "V:|-30-[redView]", options: defaultOptions, metrics: nil, views: viewsDictionary) 

self.view.addConstraints(self.red_POS_V!) 
self.view.addConstraints(self.red_POS_H!) 

和动画它:

 // we hope is only one: 
     let currV = self.red_POS_V![0] 
     let currH = self.red_POS_H![0] 


     UIView.animate(withDuration: 3) { 
      // Make all constraint changes here 

      currV.constant = 100 
      currH.constant = 300 

      self.view.layoutIfNeeded() // Forces the layout of the subtree animation block and then captures all of the frame changes 
     } 

红色视图正确地移动,如果你注释掉动画单行它可以水平或垂直工作。

小项目可用,如果你需要它。

在下面的方法:

[super viewDidLoad]; 

写这行:

[self.view layoutIfNeeded]; 
+0

我认为这会是更好的方法来放置'[self.view layoutIfNeeded];'在你设置你的用户界面之后,而不是在你的视图加载后。 – BEm