【问题标题】:Animating the resize of a UIView that has subviews为具有子视图的 UIView 调整大小设置动画
【发布时间】:2017-06-08 06:20:59
【问题描述】:

我有一个 UIView,它有一个 UITableView 子视图。

UIView 是一个菜单,初始宽度为设备宽度的 50%,并且 UITableView 对 UIView 具有 AutoLayout 约束。

在菜单中选择一个项目会触发 UIView 将大小调整为设备宽度的 33%。正如我所料,UITableView 在没有动画的情况下改变了大小,然后 UIView 通过动画赶上了它。

有没有什么简单的方法可以用我的 UIView 为我的 UITableView 设置动画,同时保持 AutoLayout 约束?

我在与 UIView 相同的动画块内尝试了以下操作:

let tableWidth = self.mm.menuOneController.tableView.bounds.size.width
let newTableWidth = (tableWidth * 2) / 3
self.mm.menuOneController.tableView.bounds.size.width = newTableWidth

这行得通,UITableView 与 UIView 一起调整动画的大小,但是 AutoLayout 并没有像我预期的那样工作。

UIView 的 X 值为 0.0,因此它固定在超级视图的左侧,当它调整大小时,它会从右手大小开始调整。然而,UITableView 似乎在左右两边都调整大小,直到达到正确的宽度(我希望这是有道理的)。

有什么建议吗?

提前致谢!

【问题讨论】:

  • 假设每个状态的约束都不是明确的,并且您已经调整了最终动画状态的约束,UIView.animate... 中的一个简单的layoutIfNeeded()(在它们的公共父视图上)就可以了。

标签: swift xcode uitableview uiview uiviewanimation


【解决方案1】:

从动画块中丢失您在问题中列出的三行,并在块的末尾添加对正在更改大小的视图上的layoutIfNeeded() 的调用。 (即<yourMenuView>.layoutIfNeeded()

这会导致在每个动画帧中重新应用约束,根据需要调整所有子视图的布局以符合约束。

【讨论】:

  • 这确实有效,但现在似乎只在第二次询问时有效。所以,我第一次添加子视图,layoutIfNeeded 肯定在做某事,它与第一次 after 做的不同,此时它正在做预期的事情。有什么建议吗?
  • 还有,你说丢三行?但是这些线决定了我的观点最终会在哪里结束,并动画化。所以我不能失去它们?
  • 只要所有的约束都连接在菜单视图和表格视图之间,您只需要调整菜单视图本身的大小,表格视图就可以随心所欲。我不确定您当前如何控制菜单视图的宽度,但我建议使用约束并更改常量或乘数(我忘记了乘数是否可动画)。否则,您最终会得到自动布局和直接框架操作,可能会相互冲突。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2013-01-22
  • 2014-09-02
  • 2013-04-12
  • 2014-05-13
  • 2012-08-28
  • 1970-01-01
相关资源
最近更新 更多