滚动时读取PickerView的位置

8 iphone objective-c uitableview

我有一个带自定义单元格的UIPickerView.对于每一刻,我都想知道哪个单元位于中心位置(有色选择指示器后面).UIPickerView委托方法

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
Run Code Online (Sandbox Code Playgroud)

确实提供此信息,但仅在选择器视图停止后才提供.我正在寻找的是一种检索当前"选定"单元格的方法,同时选择器视图仍在旋转并且尚未停止.

作为一种解决方法,我试图通过KVO并注册每个单元格的视图更改:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
  .
  .
[cell addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
}
Run Code Online (Sandbox Code Playgroud)

我接收到observeValueForKeyPath:ofObject:change:context:的回调,但无论我向上还是向下滚动选择器视图,接收的值似乎总是相同的:

2011-03-09 08:00:34.429 Project[35069:207] Frame: x=2.00, y=-13.00
2011-03-09 08:00:34.430 Project[35069:207] Location: x=4.00, y=-26.00
2011-03-09 08:00:34.430 Project[35069:207] Change: {
    kind = 1;
    new = "NSRect: {{2, -13}, {118, 70}}";
    old = "NSRect: {{2, -13}, {118, 70}}";
}
2011-03-09 08:00:34.431 Project[35069:207] Frame: x=2.00, y=-13.00
2011-03-09 08:00:34.431 Project[35069:207] Location: x=4.00, y=-26.00
2011-03-09 08:00:34.432 Project[35069:207] Change: {
    kind = 1;
    new = "NSRect: {{2, -13}, {118, 70}}";
    old = "NSRect: {{2, -13}, {118, 70}}";

(Location coordinates are in window frame) 
Run Code Online (Sandbox Code Playgroud)

还有什么其他的想法,我可以尝试获得这个价值?

Cal*_*leb 2

您可以使用选择器委托的-pickerView:titleForRow:forComponent:方法来很好地了解选择器轮子的位置。当您向一个方向或另一个方向滚动时,选择器将向其委托询问一行的标题(或视图)。轮子“中心”和拾取器要求的行之间的行数取决于行高,但您可能知道那是什么。

您必须进行一些尝试才能正确。选择器似乎要求一两行尚不可见,也许是为了保持滚动流畅。在我使用显示 5 行的选择器进行的测试中,选择器要求的行与中心行之间似乎存在大约 3 行差异。显然,您还必须跟踪旋转方向(向上或向下),并且在-pickerView:didSelectRow:inComponent:调用您之前,您不会知道是否选择了前两行或最后两行或三行。

  • 我在其他地方看到过这个想法,但似乎有点不安全。您永远不知道将准确预加载多少视图。在不同的 iOS 版本中,该数字可能会有所不同,也可能取决于设备的内存可用性。我查过文档,但找不到这方面指定的任何内容。 (3认同)