iOS 13 Segmented Control: убрать жест смахивания для выбора сегмента - PullRequest
6 голосов
/ 01 октября 2019

TLDR: Как удалить распознаватель жестов смахивания / панорамирования для UISegmentedControl на iOS 13?

Привет, на iOS 13, лоты изменились с UISegmentedControl. В основном, изменения были внешними. Но есть еще одно изменение функциональности, которое портит мое приложение.

В iOS 13 с помощью UISegmentedControls теперь можно проводить пальцем / панорамированием, чтобы изменить выбранный сегмент в дополнение к касанию сегмента, который вы хотите выбрать.

В моем приложении у меня в основном естьUISegmentedControl, встроенный в представление прокрутки. UISegmentedControl слишком длинный, чтобы на экране отображались все значения, поэтому я создал представление прокрутки, равное ширине экрана, ширина содержимого которого равна длине UISegmentedControl, и для доступа к невидимым сегментам пользователь проводит пальцем по экрану. "scrollview" и сегментированные элементы управления.

Это прекрасно работало вплоть до iOS 13, и теперь пользователь не может прокручивать горизонтальный фоновый скроллвид при перетаскивании на сегментированный элемент управления, потому что я предполагаю прокрутку scrollviewраспознаватель отменяется новым пролистыванием прокрутки для выбора жеста.

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

Спасибо, дайте мне знать, если проблема неясна

1 Ответ

6 голосов
/ 02 октября 2019

У меня похожая настройка (UISegmentedControl внутри UIScrollView bc, это слишком долго, и клиент не хотел сжимать содержимое, чтобы соответствовать). Это сработало для меня (построено на Xcode 11.1):

class NoSwipeSegmentedControl: UISegmentedControl {

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

Затем установите класс моего UISegmentedControl на это. В моем приложении это только предотвращает жест смахивания для выбора на UISegmentedControl объектах, встроенных в UIScrollView. Если это не в UIScrollView ничего не ведет себя по-другому. Что имеет смысл, потому что gestureRecognizerShouldBegin() возвращает true по умолчанию. Так что почему это позволяет UIScrollView иметь приоритет над жестом смахивания, я понятия не имею. Но надеюсь, это поможет.

...