Я пытаюсь прикрепить модификатор к ScrollView, который по-прежнему позволяет прокручивать и отключает все основные кнопки:
struct ContentView1: View {
var body: some View {
ScrollViewButtonDisableView()
.modifier(ScrollHitModifier())
}
}
struct ScrollViewButtonDisableView: View {
var body: some View {
ScrollView {
VStack {
ForEach(0...100, id: \.self) { buttonNumber in
Button("Press \(buttonNumber)") {
print("Button number \(buttonNumber) pressed")
}
.buttonStyle(.borderedProminent)
.font(.title)
.padding()
}
}
}
}
}
struct ScrollHitModifier: ViewModifier {
func body(content: Content) -> some View {
content
.allowsHitTesting(false)
}
}
К сожалению, в результате ни кнопки, ни прокрутка больше не работают. Я все еще хочу иметь возможность прокручивать.
Я знаю, что могу добавить модификатор ScrollHitModifier() в VStack в ScrollViewButtonDisableView, но это противоречит цели того, что я ищу. Я хотел бы добавить модификатор в общую структуру и не помещать его в структуру.
Есть ли способ прикрепить модификатор .allowsHitTesting
к ScrollViewButtonDisableView и при этом разрешить прокрутку?
Вы можете добавить пустышку TapGesture
в качестве .highPriorityGesture
к ScrollView
. Это блокирует жесты касания содержимого внутри ScrollView
, но по-прежнему позволяет выполнять прокрутку.
РЕДАКТИРОВАТЬ Добавление .including: .gesture
, кажется, помогает предотвратить попадание жестов в подпредставления (см. комментарии). В документации для этого GestureMask
говорится:
Включите добавленный жест, но отключите все жесты в иерархии подпредставлений.
...это именно то, что нужно!
struct ScrollHitModifier: ViewModifier {
func body(content: Content) -> some View {
content
.highPriorityGesture(
TapGesture(),
including: .gesture
)
}
}
@Пит Работая на симуляторе iPhone 15 с iOS 17.4, я не вижу эффекта нажатия кнопки, который вы описываете. В какой среде вы работаете?
Запуск на iPhone Simulator 15 Pro с iOS 17.4, M2 max. Эффект нажатия кнопки очень незаметен и происходит только один раз для каждой кнопки после прокрутки, и представление приходится перестраивать. Я также проверил это на своем iPhone 15 pro max — тот же эффект.
@Пит, я не смог увидеть это при простом касании (я пробовал с темным и светлым режимами, также пробовал с включенными формами кнопок -> эффект касания не заметен). Тем не менее, я заметил изменение цвета при небольшом перетаскивании, так что, возможно, это сработало? В любом случае добавление .including: .gesture
кажется помогает. Обратный вызов .onEnded
также можно опустить. Ответ обновлен.
Теперь работает отлично, .include полностью отключает мерцание! Блестящее решение.
Это действительно отличный обходной путь! Одна небольшая проблема - когда я нажимаю на кнопку, она слегка мерцает. Кажется, что кнопка сначала реагирует, а затем жест отменяет ее и отключает. Все за доли секунды. Есть идеи по отключению такого поведения?