Подтвердить что ты не робот

Как отменить прокрутку в UIScrollView

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

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

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

4b9b3361

Ответ 1

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

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

Все самое лучшее.

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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