仅在满足条件时如何应用edgeIgnoringSafeArea?

Posted

技术标签:

【中文标题】仅在满足条件时如何应用edgeIgnoringSafeArea?【英文标题】:How to apply edgesIgnoringSafeAre just if a condition is satisfied? 【发布时间】:2021-03-25 11:08:57 【问题描述】:

我有这个:

extension UIDevice 
  
  static func hasNotch() -> Bool 
    let bottom = UIApplication.shared.windows.filter $0.isKeyWindow.first?.safeAreaInsets.bottom ?? 0
    return bottom > 0
  

我想申请一个

.edgesIgnoringSafeArea(.top)

只要设备有缺口。

我创建了这个视图修饰符,但出现了各种错误。

struct IgnoreTopSafeArea: ViewModifier 
    
  func body(content: Content) -> some View 
    if UIDevice.hasNotch() 
      content
        .edgesIgnoringSafeArea(.top)
     else 
      content
       
  


extension View 
  func ignoreTopSafeArea() -> some View 
    self.modifier(IgnoreTopSafeArea)
  

函数声明了一个不透明的返回类型,但它的主体中没有返回语句来推断基础类型

调用“edgesIgnoringSafeArea”的结果未使用

“IgnoreTopSafeArea.Content”(又名“_ViewModifier_Content”)类型的表达式未使用

我该怎么做?

【问题讨论】:

【参考方案1】:

你几乎做到了,需要使用 () 并且你不需要那个函数来读取缺口。

struct ContentView: View 
    
    var body: some View 
        
        Color.red
            .ignoreTopSafeArea()
  
    


版本 1:

struct IgnoreTopSafeArea: ViewModifier 
    
    func body(content: Content) -> some View 
        
        return Group 
            
            if hasNotch() 
                content
                    .edgesIgnoringSafeArea(.top)
             else 
                content
            
            
        
        
    
    



func hasNotch() -> Bool 
    let bottom = UIApplication.shared.windows.filter $0.isKeyWindow.first?.safeAreaInsets.bottom ?? 0
    return bottom > 0


版本 2:

struct IgnoreTopSafeArea: ViewModifier 
    
    func body(content: Content) -> some View 
        
        return GeometryReader  geometry in
            
            Group 
                
                if geometry.safeAreaInsets.bottom > 0 
                    content
                        .edgesIgnoringSafeArea(.top)
                
                else 
                    content
                
            
            .position(x: geometry.size.width/2, y: geometry.size.height/2)
            
        
        
    


适用于两个版本:

extension View 
    func ignoreTopSafeArea() -> some View 
        self.modifier(IgnoreTopSafeArea())  // <<: here ()
    

【讨论】:

以上是关于仅在满足条件时如何应用edgeIgnoringSafeArea?的主要内容,如果未能解决你的问题,请参考以下文章

确保 iOS 4 应用程序仅在设备满足特定密码条件时运行

如何编写查询以仅在满足条件时才显示值?

仅在满足另一个条件时如何按列过滤查询

仅在满足父模型的给定条件时如何获取模型关系

如何制作 Segue Pass 数据并且仅在满足某些条件时执行

如何仅在满足条件时启动调试器