1

我正在尝试构建一个自定义UIPickerView替换类,主要用于学习目的,但为了在我正在开发的应用程序中实现它。我在我的应用程序的 UI 上投入了大量时间和精力,但现在默认设置UIPickerView不合适。

我看到这个Dribble模拟了一个看起来非常漂亮的日期/时间选择器,但我意识到在UIPickerView没有一些重大黑客攻击的情况下,没有机会可以如此大量地自定义。

经过大量阅读和调查,我发现它的组件UIPickerView使用UITableViews 而不是UIScrollView我最初假设的平原。这令人困惑,原因有两个:

定制UITableViewCells 是 derriere 的一大痛点。并不是说它很辛苦,只是费力并且很少产生所需的结果。尽管开销很小,但不知何故UIPickerView设法做到了这一点。我会假设组件中的每一行只使用UITableViewCellStyleDefault一个自定义视图,contentView但你知道他们对假设的看法。

让我失望的第二件事是UIPickerView符合UITableViewDataSource协议,但不符合UITableViewDelegate协议。这似乎有点奇怪,因为委托负责提供正确的高度,– tableView:heightForRowAtIndexPath: UIPickerView但是确实允许您通过设置组件的大小– pickerView:rowHeightForComponent:

与此一致,使用表格视图似乎也是一个奇怪的选择,因为它们本身不会像滚动视图那样“捕捉”到指定的行pagingEnabled

谁能解释为什么默认值UIPickerView不符合上述委托?用 a 来实现我的自定义选择器会更容易,UIScrollView还是应该UITableView提供所需的功能?

4

3 回答 3

3
  1. UIPickerView实际上符合UITableViewDelegate协议,但只是没有在公共标头中公开它。class_copyProtocolList您可以使用功能检查自己。

  2. 在内部使用 UITableView 可以更轻松地实现具有大量行的选择器,因为 UITableView 为重用单元格提供了很好的支持,否则 Apple 需要再次为选择器重新实现该逻辑 - 这没有多大意义(对不起,我没有看到在这种情况下自定义 UITableViewCell 的任何大问题,因此很难对此发表评论)

  3. 由于 UITableView 是 UIScrollView 子类,因此您可以将其“捕捉”到特定位置,检查协议中可用于该目的的scrollViewWillEndDragging:withVelocity:targetContentOffset:方法。UIScrollViewDelegate

于 2013-03-27T09:49:17.023 回答
0

自定义UIPickerView是通过使用UIViewController包含尽可能多UITableView的字段的子类来模仿它的行为来完成的。

例如:如果您想要一个时间选择器,请使用 2 个表格视图

您应该使用图像等在 xib 中设置它们的样式。

重现这种行为有点困难的是UIPickerView“捕捉”到最近的单元格的部分,尤其是让它正确

此外, a 中的单元格UIPickerView很简单,单元格之间没有边框/分隔符,文本标签居中,并且。您看到的只是覆盖在UITableViews 前面的图像。

至于为什么不完全符合. 因此,它缺少一些对此不是特别有用的委托。UITableViewDelegateUITableViewUIPickerView

但我想我们都同意一件事:确实,建立定制UIPickerView是一个很大的痛苦,应该更容易。

看看这个组件,看起来很不错,虽然我自己没有测试过。计算机逻辑x/AFPickerView

于 2013-03-27T10:00:52.960 回答
0

我设法UIPicker通过扩展UICollectionView.

虽然UICollectionView通常用于一个部分中有多个项目的情况,但您可以只拥有一个项目并且它工作正常。如果启用分页,您将获得与 a 类似的行为UIPicker,但它有一个“更粘”的滚动,一次只允许您滚动一个项目,如果这是您想要的,这可能会更好。此外,您可以垂直或水平滚动。你甚至可以有一个带有一些额外代码的 2D 选择器。

于 2016-04-05T19:50:45.440 回答