В SwiftUI, что приоритетнее: highPriorityGesture или simultaneousGesture?

Ответ

highPriorityGesture имеет приоритет над simultaneousGesture, так как они решают разные задачи:

  • .highPriorityGestureпереопределяет стандартные жесты view. Жест выполняется вместо жестов, которые view обрабатывает по умолчанию (например, тап поверх Button или ScrollView).
  • .simultaneousGesture – позволяет жесту работать параллельно с другими жестами, включая стандартные (например, масштабирование и прокрутка в ScrollView).

Ключевое правило: Если оба модификатора применены к одному view, сначала будет обработан highPriorityGesture, потенциально блокируя simultaneousGesture.

Пример, демонстрирующий приоритет:

Text("Нажми на меня")
    .highPriorityGesture(
        TapGesture().onEnded { print("Сработал highPriorityGesture") }
    )
    .simultaneousGesture(
        TapGesture().onEnded { print("Сработал simultaneousGesture") }
    )
// В консоли будет только: "Сработал highPriorityGesture"

Ответ 18+ 🔞

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

Вот смотри, у нас тут два модификатора, как два упрямых козла на мосту: highPriorityGesture и simultaneousGesture. И они, сука, решают принципиально разные задачи, понимаешь?

  • .highPriorityGesture – это такой наглый мудак, который всех отодвигает локтями и кричит: «Я тут главный, блядь!». Он полностью перебивает все стандартные жесты, которые вьюха умеет делать сама по себе. Например, ты на Button нажмёшь – а он вместо клика по кнопке выполнит твой кастомный жест. Или в ScrollView начнёшь скроллить – а он тебя послушает и сделает что-то своё, а прокрутка нахуй не сработает. Он работает ВМЕСТО дефолтных жестов.

  • .simultaneousGesture – это уже более адекватный товарищ, дипломат, блядь. Он говорит: «Давайте, ребята, жить дружно, можно и так, и эдак». Он позволяет твоему жесту работать ПАРАЛЛЕЛЬНО, одновременно с другими жестами, в том числе и со стандартными. Хочешь в ScrollView и скроллить, и своим жестом масштабировать? Вот для этого он и нужен, ёпта.

А теперь главное, на чём все обжигаются, как хуй на сковородке: если ты, такой умный, навесишь оба этих модификатора на одну и ту же вьюху, то что получится?

Правило простое, как три рубля: сначала всегда отработает highPriorityGesture. Он же приоритетный, нахуй! Он такой важный, что может запросто заблокировать и заткнуть рот simultaneousGesture. Тот просто не успеет пикнуть, его уже перехватят.

Вот, глянь на этот пример, тут всё как на ладони, блядь:

Text("Нажми на меня")
    .highPriorityGesture(
        TapGesture().onEnded { print("Сработал highPriorityGesture") }
    )
    .simultaneousGesture(
        TapGesture().onEnded { print("Сработал simultaneousGesture") }
    )
// В консоли будет только: "Сработал highPriorityGesture"

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