2012-02-08 3 views
4

Я только что обнаружил, что если я делаю следующее:UIPickerView, обнаружение запуска и остановки «катящегося колеса»?

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

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

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

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

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

ответ

-1

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

+1

И как бы вы "проверить" ключи анимации? Можете ли вы дать более полный ответ, который будет подробно описан в этой методологии. Я наткнулся на ваш ответ, надеясь ответить на один вопрос, но теперь у меня больше вопросов. – Pavan

+0

AnimationKeys, похоже, не работает в 2015 году. Ответ DrainBoy ниже работал для меня, после того как я преобразовал его код в Swift. – ObjectiveTC

3

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

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

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

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

-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"); 
} 
+0

Это не работает (проверено). – Emilio

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

Это сработало для меня. Благодаря! – ObjectiveTC

0

Swift версия с расширением @DrainBoy отвечает

extension UIView { 
func isScrolling() -> Bool { 

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

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

Expanded @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()} 

    } 
} 
} 
0

Expanded @iluvatar_GR, @Robert_at_Nextgensystems ответить

использовано Жест, 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] Доля Пример ссылки на источник!

enter Sample Source link

Смежные вопросы