UIPickerView, обнаружить "вращающееся колесо", запустить и остановить? - PullRequest
6 голосов
/ 09 февраля 2012

Я только что обнаружил, что если я сделаю следующее:

  1. Нажмите кнопку, которая оживляет UIPickerView на мой взгляд
  2. Быстро начать вращение колеса в направлении, затем мимо, последнего пункта
  3. Отклонить вид с помощью кнопки

Тогда еще не выбран последний элемент.

Я пытался это сделать, просто выводя на консоль всякий раз, когда вызывался метод didSelectRow, и он срабатывал, когда колесо стабилизировалось на последнем элементе.

Могу ли я обнаружить, что колесо все еще вращается, чтобы я мог отложить проверку его на выбранное значение, пока оно не стабилизируется?

Если это имеет значение, я программирую на MonoTouch, но я могу читать код Objective-C достаточно хорошо, чтобы переопределить его, если у вас есть пример кода, который есть.

Ответы [ 7 ]

7 голосов
/ 18 октября 2014

Поскольку анимационные клавиши не работают, я написал эту простую функцию, которая работает для определения, движется ли 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;
}

В конечном итоге он возвращает истинные пять уровней глубины.

3 голосов
/ 12 ноября 2016

Расширенный @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 голосов
/ 12 октября 2012

Поскольку animationKeys, похоже, больше не работает, у меня есть другое решение.Если вы проверите подпредставления UIPickerView, вы увидите, что для каждого компонента есть UIPickerTableView.

Этот UIPickerTableView действительно является подклассом UITableView и, конечно, UIScrollView,Поэтому вы можете проверить его значение contentOffset, чтобы обнаружить разницу.

Кроме того, его scrollViewDelegate по умолчанию равно нулю, поэтому я предполагаю, что вы можете безопасно установить свой объект для обнаружения scrollViewWillBeginDragging, scrollViewDidEndDecelerating и т. Д.

Сохраняя ссылку на каждый UIPickerTableView, вы сможете реализовать эффективный метод isWheelRolling.

1 голос
/ 23 ноября 2017

Расширенный @iluvatar_GR, @Robert_at_Nextgensystems answer

Используется жест, UIScrollView isDragging или isDecelerating.

// 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] Поделиться Пример Ссылка на источник!

введите ссылку на источник выборки

1 голос
/ 08 апреля 2016

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
 }
}
0 голосов
/ 05 июля 2013

Вы можете использовать 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");
}
0 голосов
/ 09 февраля 2012

Я думаю, вы можете просто проверить, находится ли UIPickerView в середине анимации, и дождаться его остановки.Здесь ответили ссылка

...