UIPickerView,检测“滚轮”启动和停止?

时间:2012-02-08 22:09:39

标签: ios xamarin.ios uipickerview

我刚刚发现,如果我执行以下操作:

  1. 点击动画UIPickerView到我的视图
  2. 的按钮
  3. 快速启动滚轮,然后经过最后一个项目
  4. 使用按钮
  5. 关闭视图

    然后它还没有选择最后一个项目。

    我试图通过在didSelectRow方法被触发时简单地输出到控制台,并在车轮稳定在最后一个项目时触发。

    我是否可以检测到滚轮仍在滚动,以便我可以延迟检查选定的值,直到它稳定下来?

    如果重要的话,我正在使用MonoTouch进行编程,但如果您有一个代码示例,我可以很好地阅读Objective-C代码以重新实现它。

7 个答案:

答案 0 :(得分:7)

由于动画按键不起作用,我编写了这个简单的函数,用于检测UIPickerView当前是否正在移动。

-(bool) anySubViewScrolling:(UIView*)view
{
    if( [ view isKindOfClass:[ UIScrollView class ] ] )
    {
        UIScrollView* scroll_view = (UIScrollView*) view;
        if( scroll_view.dragging || scroll_view.decelerating )
        {
            return true;
        }
    }

    for( UIView *sub_view in [ view subviews ] )
    {
        if( [ self anySubViewScrolling:sub_view ] )
        {
            return true;
        }
    }

    return false;
}

它最终返回真正的五个级别。

答案 1 :(得分:3)

由于animationKeys似乎不再起作用,我有另一个解决方案。如果您查看UIPickerView的子视图,则会看到每个组件都有UIPickerTableView

UIPickerTableView确实是UITableView的子类,当然还有UIScrollView的子类。因此,您可以检查其contentOffset值以检测差异。

此外,默认情况下它的scrollViewDelegate为零,所以我假设您可以安全地设置您的对象以检测scrollViewWillBeginDraggingscrollViewDidEndDecelerating等。

通过保留对每个UIPickerTableView的引用,您应该能够实现有效的isWheelRolling方法。

答案 2 :(得分:3)

扩展@iluvatar_GR回答

extension UIView { 
func isScrolling () -> Bool {

    if let scrollView = self as? UIScrollView {
        if (scrollView.isDragging || scrollView.isDecelerating) {
            return true
        }
    }

    for subview in self.subviews {
        if ( subview.isScrolling() ) {
            return true
        }
    }
    return false
}
func waitTillDoneScrolling (completion: @escaping () -> Void) {
    var isMoving = true
    DispatchQueue.global(qos: .background).async {
    while isMoving == true {
        isMoving = self.isScrolling()
    }
        DispatchQueue.main.async {
            completion()}

    }
}
}

答案 3 :(得分:1)

Swift 4(已更新)版本,扩展为@DrainBoy答案

extension UIView  {
 func isScrolling () -> Bool {

    if let scrollView = self as? UIScrollView {
        if  (scrollView.isDragging || scrollView.isDecelerating) {
            return true
        }
    }

    for subview in self.subviews {
        if ( subview.isScrolling() ) {
            return true
        }
    }
    return false
 }
}

答案 4 :(得分:1)

扩展@iluvatar_GR,@ Robert_at_Nextgensystems回答

使用过Gesture,UIScrollView是拖拽或减速。

// Call it every time when Guesture action.
@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {
    // Changes the button name to scrolling at the start of scrolling.
    DispatchQueue.main.async {
       self._button.setTitle("Scrolling...", for: .normal)
       self._button.isEnabled = false
       self._button.backgroundColor = Utils.hexStringToUIColor(hex: "FF8FAE")
    }

    // Indication according to scrolling status
    _datePicker.waitTillDoneScrolling(completion: {
        print("completion")
        DispatchQueue.main.async {
           self._button.setTitle("Completion", for: .normal)
           self._button.isEnabled = true
           self._button.backgroundColor = Utils.hexStringToUIColor(hex: "7CB0FF")
        }
    })
}
  

[SWIFT4]分享示例来源链接!

     

enter Sample Source link

答案 5 :(得分:-1)

我认为您可以检查UIPickerView是否处于动画中并等待它停止。这是在link

回答的

答案 6 :(得分:-1)

您可以在选择器上使用SwipeGestureRecognizer。 我认为这根本不是一个完美的解决方案。

- (void)viewDidLoad
{
    [super viewDidLoad];

    _pickerSwipeGestureRecognizer.delegate = self;
    [_pickerSwipeGestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp)];
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    if([gestureRecognizer isEqual:_pickerSwipeGestureRecognizer]){
        NSLog(@"start");
    }
}

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSLog(@"end");
}