【发布时间】:2017-01-25 19:58:25
【问题描述】:
我有一个轴垂直的 UIStackView,它显示了一些类似于 UITableView 的项目。但是,我正在为它们设置动画。使用 DispatchQueue.main.asyncAfter 进行延迟。
这是我用来创建 CABasicAnimation 的代码:
let anim = CABasicAnimation(keyPath: "transform.translation.x")
anim.duration = 0.2
anim.fromValue = UIScreen.main.bounds.size.width
anim.toValue = 0
anim.isRemovedOnCompletion = true
anim.fillMode = kCAFillModeRemoved
出于某种原因,至少在模拟器上(我认为这无关紧要,因为这个应用程序应该可以在旧设备或 iPhone 7+ 等功能强大的设备上运行),动画并不总是出现在同一个地方点。
有时,单元格会飞入并距左侧约 8 个像素,有时约为 12,有时约为 20。这似乎不一致。但我认为我的 toValue 为 0,如果我没有向图层添加动画,它应该出现在正常出现的位置。
我尝试将 isRemovedOnCompletion 设置为 true,并将 fillMode 设置为已移除,但这似乎无法修复动画。
附带说明一下,随着动画的继续,有一个单元格是由水平 UIStackView 组成的,其中排列的子视图隐藏在其中。我使用 UIView.animateWithDuration 方法将它们的隐藏值设置为 false,从而为子视图设置动画。
我之所以注意到这一点,是因为当这种情况发生时,上方的单元格会弹回到它们应该在的位置,而不是偏离几个像素。
我在单元格动画后尝试了 setNeedsDisplay,也尝试了verticalStackView,但也没有用。我不明白发生了什么以及为什么这些图层不会动画到它们的正确位置。有什么想法吗?
附:垂直stackView全部在ViewController的init方法中初始化。动画发生在 viewDidAppear 方法中。我尝试通过添加 DispatchQueue.main.asyncAfter 来抵消动画,并且在 super.viewDidAppear(animated) 之后也尝试了第一件事,但两者的结果相同。
【问题讨论】:
-
您可能会更成功地为约束设置动画而不是尝试转换 X 位置。堆栈视图广泛使用自动布局,您可以在此系统之外有效地工作。
-
我尝试在 UIView 的前导值的情节提要中编辑常量,其中 UIView 位于 UIStackView 中。它不喜欢那样。当stackview不允许时,如何为位置约束设置动画?也许我需要创建一个占位符单元格。然后为内容制作动画?
-
是的,添加了一个占位符,并且修复了它。
-
是的,我打算这样做;堆栈视图非常聪明,但您需要使用它们;他们尝试计算其内容的内在大小,因此当内容为空时它们无法正常工作。一个占位符解决了这个问题。
标签: ios xcode swift3 core-animation uistackview