Как отменить прокрутку в UIScrollView - PullRequest
15 голосов
/ 20 декабря 2008

Я использую UIScrollView для создания на iPhone большого размера (более 320 пикселей).

Я сделал экземпляр UIScrollView и добавил к нему несколько подпредставлений. Проблема в том, что я хочу включить прокрутку только тогда, когда пользователь касается вне подпредставлений, прекратить прокрутку, когда пользователь касается одного из подпредставлений.

Я читаю документы и пытаюсь найти образцы, но не могу найти хороший намек. Если у вас есть идеи, пожалуйста, помогите мне.

Ответы [ 6 ]

36 голосов
/ 20 декабря 2008

UIScrollView имеет свойство scrollEnabled , которое позволяет программно отключать прокрутку. Он также имеет делегат (UIScrollViewDelegate), который позволяет вам видеть такие события, как прокрутка начала / конца. Кажется, что вы должны быть в состоянии что-то приготовить с этими вариантами в некотором роде.

8 голосов
/ 28 сентября 2010

Свойство, которое вас действительно интересует - и я сейчас проверяю это, потому что у меня та же проблема, что и у вас, - canCancelContentTouches.

Если значение этого свойства НЕТ, представление прокрутки не прокручивает независимо от движения пальца как только просмотр содержимого начинает отслеживание.

Если это не дает желаемых результатов, создайте подкласс UIScrollView и переопределите метод touchesShouldBegin:withEvent:inContentView, что и предполагает принятый ответ.

5 голосов
/ 21 января 2009

Самый простой способ сделать это - установить delayContentTouches в NO для просмотра прокрутки. Таким образом, поведение по умолчанию устанавливается таким образом, чтобы все, что является UIControl, сразу передавало касания элементу управления, а все остальное прокручивалось.

5 голосов
/ 25 декабря 2008

Если вы хотите обнаружить прикосновения внутри любого из подпредставлений UIScrollView, вам придется создать подкласс UIScrollView и переопределить методы touchesShouldBegin и touchesShouldCancelInContentView, которые специально созданы для этой цели.

Кроме этого, вы не можете идентифицировать прикосновения в подпредставлениях, поскольку UIScrollView сам обрабатывает все прикосновения и не передает их своим подпредставлениям.

Всего наилучшего.

2 голосов
/ 23 декабря 2008

Вы также можете использовать ULcrollViewController и переопределять методы touchesBegan, touchesMoved и touchesEnded. Если ваша реализация никогда не вызывает реализацию суперкласса, она не будет прокручиваться.

0 голосов
/ 09 апреля 2019

Моя проблема заключалась в том, что пользователь мог рисовать, но представление с прокруткой захватывало касание и прокручивало вместо рисования. Это мое рабочее решение:

В моем виде чертежа у меня есть:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    // Disable scroll on touch begin
    setContainerScrollingEnabled(false)
    super.touchesBegan(touches, with: event)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    // Reenable scroll on touch end
    setContainerScrollingEnabled(true)
    super.touchesEnded(touches, with: event)
}

private func setContainerScrollingEnabled(_ enabled: Bool) {

    // loop up superviews to find the scrollview
    func scrollingSuperview(of view: UIView) -> UIScrollView? {
        guard let superview = view.superview else { return nil }
        if let scrolling = view.superview as? UIScrollView { return scrolling }
        return scrollingSuperview(of: superview)
    }

    // and switch on/off scrolling
    let scrollView = scrollingSuperview(of: self)
    scrollView?.isScrollEnabled = enabled
}

и в контроллере представления, содержащем представление прокрутки, у меня есть:

// Not sure what exactly this does, but I think it allows the drawing view to have precedence. This was the missing piece of the puzzle.
scrollView.delaysContentTouches = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...