Заставить UIScrollView отказаться от UITouch

У меня есть приложение для рисования с холстом, превышающим размер экрана телефона. Я хочу реализовать прокрутку двумя пальцами и рисование одним пальцем. Пока я могу заставить прокрутку работать нормально, но когда дело доходит до рисования, начинается линия, а затем вид, в котором рисунок, теряет контроль над касанием, так что рисуется только первая часть линии. Я думаю, что scrollview возвращает управление. Точки можно рисовать просто отлично.

Это мой подкласс UIScrollView

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touches = event?.touches(for: self) else { return }
    if touches.count < 2 {
        self.next?.touchesBegan(touches, with: event)
    } else {
        super.touchesBegan(touches, with: event)
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touches = event?.touches(for: self) else { return }
    if touches.count < 2 {
        self.next?.touchesEnded(touches, with: event)
    } else {
        super.touchesEnded(touches, with: event)
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touches = event?.touches(for: self) else { return }
    if touches.count < 2 {
        self.next?.touchesMoved(touches, with: event)
    } else {
        super.touchesMoved(touches, with: event)
    }
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touches = event?.touches(for: self) else { return }
    if touches.count < 2 {
        self.next?.touchesCancelled(touches, with: event)
    } else {
        super.touchesCancelled(touches, with: event)
    }
}

override func touchesShouldCancel(in view: UIView) -> Bool {
    if (type(of: view)) == UIScrollView.self {
        return true
    }
    return false
}

person Nathaniel Ruiz    schedule 22.10.2017    source источник


Ответы (1)


Вам потребуется распознаватель жестов при длительном нажатии, подключенный к ScrollerView, установленный с минимальной продолжительностью 0 секунд, а также для распознавания только 1 касание и отмена касаний в поле зрения. сильный> опция активна.

Вы можете найти все эти параметры в инспекторе атрибутов в Interface Builder.

Пожалуйста, поиграйте немного с настройками допуска, чтобы точно настроить результаты.

person Gonzalo Durañona    schedule 22.10.2017
comment
У меня активна отмена касаний в представлении, но извините, что вы подразумеваете под распознаванием только 1 касания? Я все еще хочу, чтобы представление прокрутки распознавало 2 касания, А ТАКЖЕ передало 1 касание следующему респонденту, который был бы моим холстом. Я попробую распознаватель жестов при длительном нажатии, но мне нужно очень часто обновлять холст, чтобы имитировать рисование, и я надеялся использовать метод touchesmoved, потому что я не уверен, как это сделать в селекторе распознавателя, спасибо за ответ кстати постараюсь! - person Nathaniel Ruiz; 22.10.2017
comment
Извините, возможно, я был не ясен. Вы должны полагаться на GestureRecognizer, чтобы фиксировать касания и действовать соответствующим образом, эффективно отменяя касание для базовых представлений. Я успешно использовал эту настройку для захвата рисунков и жестов раньше. Насколько я понимаю, UIScrollView не может эффективно управлять жестами панорамирования/перетаскивания, чтобы передать их содержащимся в нем представлениям. - person Gonzalo Durañona; 22.10.2017
comment
Да я был! На самом деле я использовал другое решение, которое заключалось в подклассе UIScrollView и добавлении представлений, которые я хотел использовать, в качестве подпредставлений к подклассу вместо подпредставлений общего родительского контроллера представления. Затем UIScrollView никогда не запрашивал ответное касание, потому что это уже был ответ на действие. Теперь он работает отлично, но спасибо, я ценю ваш ответ! - person Nathaniel Ruiz; 01.11.2017