【问题标题】:Autolayout messing with my animations自动布局弄乱了我的动画
【发布时间】:2014-11-19 09:34:54
【问题描述】:

所以我在视图控制器(不是 UITableViewController)中有一个 UITableView,为了支持 iphone 6 和 6 Plus,我开始实现 Autolayout。现在一切工作顺利,问题是我在该 UITableView 的每个单元格内的 UIViews 上调整了动画大小,现在动画不会调整内部视图的大小,约束似乎会影响 UITableView 内的所有内容,即使我只想通过不同的设备保持 UITableView 居中...

我在 UITableView 上使用的约束是:

  • 内容视图中的 X 中心对齐
  • 垂直空间(到内容视图的顶部,固定值 = 114)
  • 垂直间距(到内容视图的底部,固定值 = 0)
  • UITableView 上的固定宽度 (320)

所以基本上,如果我们在 iphone 4-5s 上我们有一个使用屏幕完整宽度的 tableview,同时 iphone 6 和 6 Plus 有一个 320 固定宽度的居中 tableview。

这是我第一次使用 AutoLayout,所以我不知道这些约束如何影响 UITableView 单元格内视图上的动画,这就是我进行调用的方式:

//before the call
barraActual.frame = CGRectMake(20, 24, 5, 30);
barraPromedio.frame = CGRectMake(295, 24, 5, 30);

//animate
[UIView animateWithDuration:1.5 animations:^{
     barraActual.frame = CGRectMake(20, 24, periodoActual, 30);
     barraPromedio.frame = CGRectMake(20+periodoActual, 24, periodoAnterior, 30);
}];

编辑:请注意,视图(barraActual 和 barraPromedio)是 UITableViewCell 中的 UIView,此代码位于“cellForRowAtIndexPath”中。

如何阻止约束阻止我的视图调整大小? (因为我已经尝试在没有动画调用的情况下设置框架并且也没有工作)

或者我如何进行符合这些约束的动画调用?

谢谢!

【问题讨论】:

  • 使用自动布局,您永远不会自己更改框架属性,因为这将被自动布局覆盖。您只需使用约束指定布局。
  • 那么,AutoLayout 与动画不兼容?我有两个 UIView(彩色),我根据数据按比例对它们进行动画处理(这就是它们在 tableviewcell 中的原因,因为它们永远不会相同),因此用户可以以图形方式感知百分比(更好看)
  • 约束以 UITableView 为目标,我尝试制作动画的 UIVIews 在 UITableViewCell 内(在 UITableView 内)
  • 不,一点也不。您根本不必自己设置框架属性(和其他属性)。您必须使用约束(例如到容器的距离、宽度、高度)来表达您的布局。如果这样做,屏幕大小的更改将自动处理。 BTW 约束是对象,可以是 IBOutlets,因此您可以动态更改它们,例如在动画中。
  • 好的,我还在尝试了解 AutoLayout 的技术...有没有办法获取和更改 UIView 而不是 IBOutlet 的约束?因为在“cellForRowAtIndexPath”中,我只处理使用方法 [cell viewWithTag:X] 访问它们的视图

标签: ios uitableview animation autolayout uiviewanimation


【解决方案1】:

感谢 Reinhard Männer 指导我,感谢那些可能发现自己与我有同样误解的人:

在使用 AutoLayout 时更改视图的框架将不起作用(有或没有动画)。要进行更改,您需要设置新的约束或更改现有的约束(很可能以编程方式)。

我在 Interface Builder 中创建了新的约束来管理我想要动画的视图,现在我的动画块看起来像这样:

//animate
[UIView animateWithDuration:1.5 animations:^{
    ((NSLayoutConstraint*)(barraActual.constraints[1])).constant = periodoActual;
    ((NSLayoutConstraint*)(barraPromedio.constraints[0])).constant = periodoAnterior;
}];

晚安:)

【讨论】: