Вопрос о .gesture (жест перетаскивания) в swift ui

#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:

Пара вещей:

  1. Что касается макета, установка рамки не приведет к изменению размера текста, поскольку размер текста сам по себе соответствует его содержимому. Используйте жадный вид, такой как ZStack, если вы хотите занять все пространство.
  2. Последовательность модификаторов действительно имеет значение. Вы читаете порядок, в котором они применяются снизу вверх, поэтому в этом случае они должны идти по стеку.

Вот пример детской площадки:

 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 сотворили чудеса. Теперь функция перетаскивания работает так, как ожидалось, и мой код готов!! Как только я получу еще несколько файлов, не связанных с кодированием (звуковые файлы ворчат, ворчат ) Я буду готов к выпуску! Спасибо за всю помощь!