我试图对NavigationStack应用cornerRadius,但结果是,touch 区域被限制在初始查看位置.简而言之,如果滑块处于关闭状态,则除非touch 图像中描绘的红色区域,否则无法通过轻触将其打开.(ControllerView负责动画制作)

import SwiftUI

private struct ControllerView<Content: View>: View {
    private var content: Content
    @Binding var isOpen: Bool
    
    init(isOpen: Binding<Bool>, @ViewBuilder content: () -> Content) {
        self._isOpen = isOpen
        self.content = content()
    }
    
    var body: some View {
        GeometryReader { proxy in
            ZStack {
                Color.yellow.ignoresSafeArea()
                content
                    .cornerRadius(30) /// <- Here
                    .offset(x: isOpen ? 300 : 0)
            }
            .ignoresSafeArea()
        }
    }
}

private struct GreenView: View {
    @Binding var isOpen: Bool
    @Binding var navigation : [AnyHashable]
    
    var body: some View {
        NavigationStack(path: $navigation) {
            Color.green.ignoresSafeArea()
            .onTapGesture {
                print("GreenView tapped!")
                withAnimation { isOpen.toggle() }
            }
        }
    }
}


struct SwiftUIView9: View {
    @State private var isOpen = true
    
    var body: some View {
        ControllerView(isOpen: $isOpen) {
            GreenView(isOpen: $isOpen, navigation: .constant([]))
        }
    }
}

#Preview {
    SwiftUIView9()
}




Touchable Area

推荐答案

通过反复试验,我发现如果isOpen最初是false,即最初是offset(0),那么点击区域是正确的.

我们可以利用这一点,将偏移量初始设置为0,然后在视图出现时立即设置为isOpen ? 300 : 0

@State var appeared = false

var correctOffset: CGFloat {
    if !appeared {
        return 0
    }
    return isOpen ? 300 : 0
}

onAppear可将appeared设置为TRUE:

content
    .cornerRadius(30)
    .offset(x: correctOffset)
    .onAppear {
        DispatchQueue.main.async {
            appeared = true
        }
    }

这个不正确的touch 区行为也发生在其他一些修饰符上,比如clipped,colorInvert等等.这可能只是NavigationStack的另一个怪癖.

Swift相关问答推荐

如何在init()中使用setter/getters?

如何获取SCNCamera正在查看的网格点(SCNNode)的局部坐标和局部法线?

在visionOS 1.0中已弃用';base Color';:请改用`Color`属性

NSApplication是否需要NSApplicationDelegate?

更改 SwiftUI 中按钮矩阵的填充 colored颜色

根据其属性组合 2 个模型以在 Swift 中创建另一个模型

数组中某些元素的总和

如何让飞机与 RealityKit 中的物体相撞

如何从数据中读取以空结尾的字符串?

如何有条件地依赖桌面与 iOS 的系统库?

在 SwiftUI 中操作绑定变量

如何在 Swift 中返回 Task 中定义的变量

根据禁用与否更改 SwiftUI 中按钮的 colored颜色

Swift 3:日期与 NSDate?

为什么'nil' 与 Swift 3 中的 'UnsafePointer' 不兼容?

在 Swift 中以编程方式更新约束的常量属性?

Swift 2.0 中的 do { } catch 不处理从这里抛出的错误

Swift 2.0 按属性对对象数组进行排序

如何快速将弹出框调整为表格视图中内容的大小?

如何快速显示数组的所有元素?