可以取消 UIPickerView 动量动画吗?

Posted

技术标签:

【中文标题】可以取消 UIPickerView 动量动画吗?【英文标题】:Possible to cancel UIPickerView momentum animation? 【发布时间】:2010-12-07 22:35:47 【问题描述】:

我正在尝试使用基于 UITableView 中选定行填充的 UIPickerView 设置 UI。本质上,它与您在“开始和结束”屏幕中看到的用于在日历应用程序中添加事件的 UI 相同。

http://raoli.com/files/uipicker.png

我已经获得了我的数据源和委托的设置,因此选择器会根据选择进行填充并正确更新我的模型......大部分时间。

我遇到的一个问题是,当有人轻弹选择器视图然后更改表视图中的选择时,UIPickerViewDelegate 尝试根据表视图中的新选择记录更改,而不是原始选择。很明显,在我的代码中为什么会发生这种情况,我有一些想法可以修改我的行为以更好地表现,但我想我会看到 Apple 在他们的 UI 中做了什么。

当您在选择器旋转完成前轻拂选择器并切换时间,旋转立即停止,选择器更新为新时间类型的值,而原始时间类型保持不变。我没有看到任何取消动画的方法,但我可能是错的。我希望我是错的,因为它会让我的生活更轻松。

我可以看到的另一种选择是每个属性都有不同的 UIPickerViews 并将它们切换出来。因此,很明显,Apple 示例将有 2 个 UIPickerView 实例。这只是创建了其他需要完成的工作,我想我会看看是否有一种方法可以用最少的视图来完成。

更新 Aaron 的想法显示了一些希望,但看起来有许多关于如何根据选择器的状态将消息传递给代理的边缘案例,主要是选择器是否目前正在制作动画。由于似乎无法确定选择器当前是否正在旋转(至少通过公共 API),因此尝试解决可能的配置似乎是有问题的。我最终选择了多个选择器,当所选属性更改时切换选择器的可见性,并忽略来自现在隐藏的 UIPickerView 实例的委托消息。

【问题讨论】:

【参考方案1】:

我认为

- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated

将是一个很好的候选人。如果animatedNO,它应该会立即显示您想要的内容而无需移动。

当您决定设置数据时,调用选取器视图上的方法以反映该设置。我希望它会覆盖任何当前的动画或惯性效果,并希望您不会在委托中收到didSelectRow:。如果你这样做,可能需要忽略它。

【讨论】:

好主意,没想到,但不幸的是,它似乎并没有立即奏效。看起来pickerView:didSelectRow:inComponent: 实际上是从微调器中获取值,而不是获取作为row 传入的值。因此,即使我传入 0,我的 UIPickerDelegate 也会在调用 didSelectRow: 委托方法时得到类似 13 的值。但是,您已经产生了一个可能通过子类解决此问题的想法。谢谢! 我很困惑 - 您是否尝试使用 selectRow 或 didSelectRow 来设置微调器? 我调用selectRow:inComponent:animated设置微调器,然后调用UIPickerView委托方法pickerView:didSelectRow:inComponent: selectRow 是否停止了动画?如果确实如此,那么您可以设置一个已调用它的标志记录并忽略生成的 didSelectRow? 它确实会停止动画,这就是我的想法。今天早上我玩了一下它,当我在它旋转的情况下更改数据集时,它似乎引入了一些奇怪的东西。看起来它可能会在可能的情况下合并更新。在这种特定情况下,如果我在对reloadAllComponents 的调用中清除取消标志似乎可以工作,但我可能会遗漏一些边缘情况(例如,我想知道如何处理reloadComponent: )。

以上是关于可以取消 UIPickerView 动量动画吗?的主要内容,如果未能解决你的问题,请参考以下文章

像键盘一样显示UIPickerView,没有UITextField

Adam 优化器真的是 RMSprop 加动量吗?如果是,为啥它没有动量参数?

按下按钮后如何动画显示 UIPickerView?

如何设置 UIPickerView 的动画持续时间?

UIPickerView 高度约束动画跳跃

物理应用轨道角动量动画演示matlab源码