Get safe area inset top and bottom heights

后端 未结 15 1392
长发绾君心
长发绾君心 2020-11-30 17:30

On the new iPhone X, what would be the most proper way to get both top and bottom height for the unsafe areas?

相关标签:
15条回答
  • 2020-11-30 17:47

    In iOS 11 there is a method that tells when the safeArea has changed.

    override func viewSafeAreaInsetsDidChange() {
        super.viewSafeAreaInsetsDidChange()
        let top = view.safeAreaInsets.top
        let bottom = view.safeAreaInsets.bottom
    }
    
    0 讨论(0)
  • 2020-11-30 17:51

    Swift 4

    if let window = UIApplication.shared.windows.first {
        
        let topPadding = window.safeAreaInsets.top
        let bottomPadding = window.safeAreaInsets.bottom
        
    }
    

    Use from class

    class fitToTopInsetConstraint: NSLayoutConstraint {
        
        override func awakeFromNib() {
            
            if let window = UIApplication.shared.windows.first {
                
                let topPadding = window.safeAreaInsets.top
                
                self.constant += topPadding
                
            }
            
        }
    }
    
    class fitToBottomInsetConstraint: NSLayoutConstraint {
        
        override func awakeFromNib() {
            
            if let window = UIApplication.shared.windows.first {
                
                let bottomPadding = window.safeAreaInsets.bottom
                
                self.constant += bottomPadding
                
            }
            
        }
    }
    

    You will see safe area padding when you build your application.

    0 讨论(0)
  • 2020-11-30 17:53

    safeAreaLayoutGuide When the view is visible onscreen, this guide reflects the portion of the view that is not covered by navigation bars, tab bars, toolbars, and other ancestor views. (In tvOS, the safe area reflects the area not covered the screen's bezel.) If the view is not currently installed in a view hierarchy, or is not yet visible onscreen, the layout guide edges are equal to the edges of the view.

    Then to get the height of the red arrow in the screenshot it's:

    self.safeAreaLayoutGuide.layoutFrame.size.height
    
    0 讨论(0)
  • 2020-11-30 17:57

    I'm working with CocoaPods frameworks and in case UIApplication.shared is unavailable then I use safeAreaInsets in view's window:

    if #available(iOS 11.0, *) {
        let insets = view.window?.safeAreaInsets
        let top = insets.top
        let bottom = insets.bottom
    }
    
    0 讨论(0)
  • 2020-11-30 17:58

    To get the height between the layout guides you just do

    let guide = view.safeAreaLayoutGuide
    let height = guide.layoutFrame.size.height
    

    So full frame height = 812.0, safe area height = 734.0

    Below is the example where the green view has frame of guide.layoutFrame

    0 讨论(0)
  • 2020-11-30 17:58

    Swift 5, Xcode 11.4

    `UIApplication.shared.keyWindow` 
    

    It will give deprecation warning. ''keyWindow' was deprecated in iOS 13.0: Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes' because of connected scenes. I use this way.

    extension UIView {
    
        var safeAreaBottom: CGFloat {
             if #available(iOS 11, *) {
                if let window = UIApplication.shared.keyWindowInConnectedScenes {
                    return window.safeAreaInsets.bottom
                }
             }
             return 0
        }
    
        var safeAreaTop: CGFloat {
             if #available(iOS 11, *) {
                if let window = UIApplication.shared.keyWindowInConnectedScenes {
                    return window.safeAreaInsets.top
                }
             }
             return 0
        }
    }
    
    extension UIApplication {
        var keyWindowInConnectedScenes: UIWindow? {
            return windows.first(where: { $0.isKeyWindow })
        }
    }
    
    0 讨论(0)
提交回复
热议问题