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



我正在尝试检测此文本视图何时被滑动。代码编译良好,但我无法在实际设备上触发滑动。当我滑动时,什么也没发生。Tap似乎工作得很好。有人能告诉我我在代码中做错了什么吗?

如果这很重要的话,我正在用最新的Xcode在swift 5.3中开发一个手表操作系统应用程序。

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. 关于布局,设置框架不会改变文本大小,因为文本根据其内容调整大小。如果您想占用所有空间,请使用类似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

最新更新