swift ui 中关于 .gesture(拖动手势)的问题

Question about .gesture(drag gesture) in swift ui

我正在尝试检测此文本视图何时被滑动。代码编译正常,但我无法在我的实际设备上触发滑动。当我滑动时,没有任何反应。 Tap 似乎工作得很好。谁能告诉我我的代码哪里做错了?

以防万一,我正在使用最新的 Xcode.

在 swift 5.3 中开发手表 OS 应用程序
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. 关于布局,设置框架不会改变文本大小,因为文本本身会根据其内容调整大小。如果您想占用所有 space.
  2. ,请使用像 ZStack 这样的贪心视图
  3. 修饰符的顺序很重要。您阅读了它们从下到上的应用顺序,因此在这种情况下,它们需要进入堆栈。

这是一个游乐场示例:

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([=10=])})

  }
}

let host = UIHostingController(rootView: V().frame(width: 500.0, height: 500.0))
host.preferredContentSize = CGSize(width: 300, height: 300)
PlaygroundPage.current.liveView = host