如何覆盖edgesIgnoringSafeArea(或任何视图修改器)

Posted

技术标签:

【中文标题】如何覆盖edgesIgnoringSafeArea(或任何视图修改器)【英文标题】:How to override edgesIgnoringSafeArea (or any View modifier) 【发布时间】:2020-12-31 06:15:59 【问题描述】:

我正在尝试覆盖edgesIgnoringSafeArea(_:) 的功能,因为我在视图中对垂直安全区域进行了自定义处理。但是,没有超级可以调用,所以我不确定除了处理每个安全区域边缘之外如何进行。任何建议将不胜感激。

// Will use later for custom handling of vertical safe area
@State private var edgesThatIgnoreSafeArea: Edge.Set = []

func edgesIgnoringSafeArea(_ edges: Edge.Set) -> some View 
    edgesThatIgnoreSafeArea = edges

    // There is no super here to call, and calling self would just call this function again
    return AnyView(edgesIgnoringSafeArea(edges.subtracting(.vertical)))  

【问题讨论】:

【参考方案1】:

我们不能覆盖修饰符,但我们可以添加我们自己的使用标准的,比如

extension View 
    func edgesIgnoringHorizontal(_ edges: Edge.Set) -> some View 
         self.edgesIgnoringSafeArea(edges.subtracting(.vertical))
    

注意:虽然我认为 overriding 没有多大意义,因为仅使用 .edgesIgnoringSafeArea(.horizontal) 更简单、更明显、更易读……但无论如何。

【讨论】:

想出了一种方法来进行覆盖。看我的回答。【参考方案2】:

想出了如何做到这一点。我用AnyView 包裹了我的视图,并对其应用了选择性安全区域。

@State private var edgesThatIgnoreSafeArea: Edge.Set = []

func edgesIgnoringSafeArea(_ edges: Edge.Set) -> some View 
    edgesThatIgnoreSafeArea = edges

    return AnyView(self).edgesIgnoringSafeArea(edges.subtracting(.vertical))

【讨论】:

如果有人有更好的方法,绝对愿意接受对此答案或不同答案的反馈。

以上是关于如何覆盖edgesIgnoringSafeArea(或任何视图修改器)的主要内容,如果未能解决你的问题,请参考以下文章

使用 .edgesIgnoringSafeArea() 时,SwiftUI 布局超出设备范围

在我的 NavigationView '.edgesIgnoringSafeArea' 中不会将内容移动到安全区域之外

SwiftUI - edgesIgnoringSafeArea 在 iOS 13.4 中的行为不同

SwiftUI:防止 Image() 将视图矩形扩展到屏幕边界之外

如何在swiftUI中删除顶部安全区域

SwiftUI - 使列表分隔线扩展到触摸屏边缘