ScrollView не прокручивается при перетаскивании на кнопки - PullRequest
36 голосов
/ 18 августа 2010

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

Ответы [ 5 ]

95 голосов
/ 23 августа 2010

Это происходит потому, что UIButton подпредставления UIScrollView (я предполагаю, что кнопки добавляются как подпредставления в вашем случае) отслеживают касания, а не представление прокрутки. UIScrollView метод touchesShouldCancelInContentView является ключом здесь. В соответствии с его описанием: «Возвращаемым значением по умолчанию является YES, если представление не является объектом 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];
}
9 голосов
/ 10 октября 2014

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

class UIButtonScrollView: UIScrollView {

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

        return super.touchesShouldCancelInContentView(view)

    }

}

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

5 голосов
/ 07 декабря 2016

Решение Swift 3

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIButton {
        return true
    }
    return super.touchesShouldCancel(in: view)
}
0 голосов
/ 25 октября 2018

В моем случае я решил это следующим образом.

в ViewDidLoad

self.scrollView.panGestureRecognizer.delaysTouchesBegan = self.scrollView.delaysContentTouches;

дюйм.

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    if ([view isKindOfClass:[UIControl class]]) return YES;
    return NO;
}
0 голосов
/ 12 апреля 2018

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

...