如果一个 ShapeView 最初在外面,但被 scaleEffect 带入屏幕边界,如何为整个 ShapeView 启用 onTapGesture

问题描述 投票:0回答:1

我希望绘制最初、全部或部分位于屏幕边界之外并且具有 .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 最初可以在屏幕边界之外?

swift swiftui shapes swiftui-ontapgesture
1个回答
0
投票

我是新手,并根据反复试验提出这个结论并解决我自己的问题,以便其他人可能比这有更多见识

如果我创建一个封闭的填充路径,那么屏幕边界之外的任何部分都不会响应 onTap,如问题中的示例

但是,如果我对该填充路径进行缩放和重新定位的副本,使其保留在屏幕边界内,并且当且仅当我还使用也在屏幕边界内的框架修改路径时,该路径会响应 .onTap .无论应用多少拖动和缩放,.onTap 响应仍然存在

应用是这样的:多个封闭的填充路径可以表示,例如,机器的部件,其中每个部件都有有意义的大小和位置,而不管屏幕边界。然后可以拖动和缩放它们并仍然响应 .onTap

© www.soinside.com 2019 - 2024. All rights reserved.