UIPickerView: Get row value while spinning?

﹥>﹥吖頭↗ 提交于 2019-11-28 13:32:41

Perhaps try implementing the delegate method:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

You could treat it as a passthrough (just passing back the reusingView parameter) but each time it was called you would know that view was coming on the screen as the user scrolled - then you could calculate how many views offset from this one the center view was.

The UIPickerView dimensions are fairly consistent. Instead of subclassing it, perhaps you could overlay a UIView of your own on top of the picker view, from which you can track and measure dragging motions, before passing those touches down to the picker view.

You can find UIScrollView in UIPickerView hierarchy by the following method:

func findScrollView(view:UIView) -> UIScrollView? {
    if view is UIScrollView {
        return view as? UIScrollView
    }
    for subview in view.subviews {
        if subview is UIView {
            let result = findScrollView(subview as UIView)
            if result != nil {
                return result
            }
        }
    }
    return nil
}

Implement and setup UIScrollViewDelegate:

let scrollView = findScrollView(pickerView)
if scrollView != nil {
    scrollView!.delegate = self
}

And detect current selected item:

func scrollViewDidScroll(scrollView: UIScrollView) {
    let offset = scrollView.contentOffset.y
    let index = Int(offset/itemHeight)
    if index >= 0 && index < items.count {
        let item = items[index]
        // do something with item
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!