#ios #swift #swiftui #gesture #drag
#iOS #swift #swiftui #жест #перетаскивание
Вопрос:
Я пытаюсь определить, когда этот текстовый вид был включен. Код компилируется нормально, но я не могу запустить свайп на моем реальном устройстве. Когда я провожу пальцем, ничего не происходит. Кажется, что Tap работает просто отлично. Может кто-нибудь сообщить мне, что я делаю неправильно в своем коде?
В случае, если это имеет значение, я разрабатываю приложение watch OS в swift 5.3 с последним Xcode.
var body: some View {
Text(tempstring).onTapGesture { checkStateRoll() }
.frame(maxWidth: .infinity, maxHeight: .infinity)
.gesture(DragGesture(minimumDistance: 10, coordinateSpace: .global)
.onEnded { value in
let horizontalAmount = value.translation.width as CGFloat
let verticalAmount = value.translation.height as CGFloat
if abs(horizontalAmount) > abs(verticalAmount) {
horizontalAmount < 0 ? leftswipe() : rightswipe()
} else {
verticalAmount < 0 ? upswipe() : downswipe()
}
tempstring = String(numdice) "d" String(typesofdice[typedice])
speaknumber()
} )
.background(progstate == 2 ? Color.blue : Color.red)
}
}
Большое спасибо за любую помощь. Это ставило меня в тупик уже несколько недель.
Комментарии:
1. Я бы попытался поставить задачу перетаскивания жеста в качестве первого модификатора, а жест нажатия — во второй. Иногда иерархия модификаторов имеет значение. Надеюсь, это поможет.
Ответ №1:
Пара вещей:
- Что касается макета, установка рамки не приведет к изменению размера текста, поскольку размер текста сам по себе соответствует его содержимому. Используйте жадный вид, такой как ZStack, если вы хотите занять все пространство.
- Последовательность модификаторов действительно имеет значение. Вы читаете порядок, в котором они применяются снизу вверх, поэтому в этом случае они должны идти по стеку.
Вот пример детской площадки:
import SwiftUI
import PlaygroundSupport
struct V: View {
var body: some View {
ZStack {
Color.red
Text("Test")
}
.onTapGesture { print("tap") }
.gesture(DragGesture(minimumDistance: 10, coordinateSpace: .global).onEnded { print($0)})
}
}
let host = UIHostingController(rootView: V().frame(width: 500.0, height: 500.0))
host.preferredContentSize = CGSize(width: 300, height: 300)
PlaygroundPage.current.liveView = host
Комментарии:
1. Я действительно ценю всю помощь. В конце концов, проблема заключалась в том, что я пытался перетащить сам текстовый фрейм, когда я действительно хотел иметь возможность проводить пальцем по экрану в любом месте. Добавление ZStack вокруг него и применение кода перетаскивания к ZStack сотворили чудеса. Теперь функция перетаскивания работает так, как ожидалось, и мой код готов!! Как только я получу еще несколько файлов, не связанных с кодированием (звуковые файлы ворчат, ворчат ) Я буду готов к выпуску! Спасибо за всю помощь!