我希望绘制最初、全部或部分位于屏幕边界之外并且具有 .onTapGesture 修饰符的 ShapeView。 .scaleEffect 可以将 ShapeViews 带入屏幕边界。
但是,最初位于屏幕边界之外的 ShapeView 的任何部分都不会响应 .onTapGesture,即使通过 .scaleEffect 进入屏幕边界也是如此。
以下代码使用 XCode 版本 14.0.1 (14A400) 和模拟器 iPadPro (12.9)(第 2 代)和 IOS 16.0 运行
import SwiftUI
struct TestTapArea{
let x = 300.0
let y = 700.0
let oX = 400.0
let oY = -200.0
func path(_ choice: String) -> some View {
var corners: [CGPoint] = []
var color: Color = .black
if choice == "red" {
corners = [CGPoint(x: 100.0, y: 100.0), CGPoint(x: x, y: 100.0), CGPoint(x: x, y: y) ]
color = Color.red
}
if choice == "green" {
corners = [CGPoint(x: oX , y: oY), CGPoint(x: oX + x, y: oY), CGPoint(x: oX + x, y: oY + y) ]
color = Color.green
}
return
myPath(corners, color)
.onTapGesture {
print(choice)
}
func myPath(_ corners: [CGPoint], _ color: Color)
-> _ShapeView<Path, Color> {
return
Path { path in
path.move(to: corners[0])
path.addLine(to: corners[1])
path.addLine(to: corners[2])
path.closeSubpath()
}
.fill(color) as! _ShapeView<Path, Color>
}
}
}
struct ContentView: View {
let testTapArea = TestTapArea()
var body: some View {
ZStack {
testTapArea.path("red")
testTapArea.path("green")
}
.border(.black, width: 1)
.scaleEffect(0.5)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
border只是表示响应.onTapGesture的区域之间的边界。
边框或 ShapeViews 的位置修饰符无效。
如果我最初在屏幕边界内创建 ShapeViews 则没有问题。
但是,我想听听建议:确保所有 ShapeView 最初都在屏幕边界内是否是一种更好的编码方法,或者是否有更好的方法来实现此类代码以便 ShapeView 最初可以在屏幕边界之外?
我是新手,并根据反复试验提出这个结论并解决我自己的问题,以便其他人可能比这有更多见识
如果我创建一个封闭的填充路径,那么屏幕边界之外的任何部分都不会响应 onTap,如问题中的示例
但是,如果我对该填充路径进行缩放和重新定位的副本,使其保留在屏幕边界内,并且当且仅当我还使用也在屏幕边界内的框架修改路径时,该路径会响应 .onTap .无论应用多少拖动和缩放,.onTap 响应仍然存在
应用是这样的:多个封闭的填充路径可以表示,例如,机器的部件,其中每个部件都有有意义的大小和位置,而不管屏幕边界。然后可以拖动和缩放它们并仍然响应 .onTap