2010-08-18 4 views
34

У меня есть вид прокрутки, который использовался для прокрутки, когда на нем не было кнопок. Теперь это происходит, и при перетаскивании мыши (на симуляторе) ничего не происходит (я думаю, потому что кнопки толкаются). Как я могу сделать это правильно?ScrollView не прокручивается при перетаскивании кнопок

+1

Пробовали ли вы это на физическом устройстве, есть несколько отличий между устройствами и симулятором, а мышь и мультитач - одна из самых больших! –

ответ

92

Это происходит из-за того, что UIButton подпункты UIScrollView (я предполагаю, что кнопки добавлены в виде подзонов в вашем случае) отслеживают штрихи, а не прокрутку. UIScrollView метод touchesShouldCancelInContentView является ключевым здесь. Согласно его описанию: «Возвращаемое по умолчанию значение равно YES, если view не является объектом UIControl, в противном случае он возвращает NO.», То есть для UIControl объектов (кнопок), UIScrollView не пытается отменить касания, которые предотвращают прокрутку.

Так, чтобы прокрутка с помощью кнопок:

  1. Убедитесь UIScrollView свойство canCancelContentTouches устанавливается в YES.
  2. Подкласс UIScrollView и переопределить touchesShouldCancelInContentView вернуть YES, когда содержание объекта зрения является UIButton, как это:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
{ 
    if ([view isKindOfClass:[UIButton class]]) { 
     return YES; 
    } 

    return [super touchesShouldCancelInContentView:view]; 
} 
+0

Благодарю вас за ответ. Я изменил прокрутку с изображениями для имитации кнопок (и отслеживания касаний, чтобы знать, когда вызывать метод). Я попробую ваше решение и посмотрю, как это работает. благодаря! – DanielaM

+4

@ DanielaM Если этот чудесный ответ помог вам, как это действительно кажется, было бы хорошо принять его. – iHunter

+0

** смелый ** @Roman K - Ты мой герой! Я провел 2 дня, прочитав во многих сообщениях \ форумах об этой проблеме перекрытия, но никакая настройка или решение действительно не работали. Ваше решение действительно работает! Приветствия :-) – Shvalb

9

Я основал этот вопрос в поисках скорейшего решения этой проблемы, я «перевел» ее как это:

class UIButtonScrollView: UIScrollView { 

    override func touchesShouldCancelInContentView(view: UIView!) -> Bool { 
     if (view.isKindOfClass(UIButton)) { 
      return true 
     } 

     return super.touchesShouldCancelInContentView(view) 

    } 

} 

надеюсь, что это может помочь

4

Swift 3 Решение

override func touchesShouldCancel(in view: UIView) -> Bool { 
    if view is UIButton { 
     return true 
    } 
    return super.touchesShouldCancel(in: view) 
} 
Смежные вопросы