Вершина UIView плохо позиционируется при наложении на iPhone X - PullRequest
0 голосов
/ 10 января 2019

В настоящее время я накладываю UIView при нажатии кнопки поверх viewController. У меня это хорошо позиционируется на других устройствах экрана и когда я запускаю на iPhone X + устройствах. Его не очень хорошо. Чтобы он хорошо позиционировался, мне нужно вычесть 40 баллов до его текущего top safeAreaInsets Первые 20 баллов должны справиться со строкой состояния. Когда я делаю это, это работает, а затем не работает на других iPhone, у которых нет метки. Что я здесь не так делаю. Вот мой код

func contentFrame(extraTopOffset pOffset: CGFloat = 0) -> CGRect {
        var theFrame = self.view.bounds
        if let navBar = self.navigationBar {
            let topOffset = navBar.frame.origin.y + navBar.frame.size.height
            theFrame.size.height -= topOffset
            theFrame.origin.y += topOffset
        }
        if #available(iOS 11.0, *) {
            let safeInsets = UIApplication.shared.delegate!.window!?.safeAreaInsets
            let topOffset = safeInsets!.top - (20 + pOffset)
            theFrame.origin.y += topOffset
            theFrame.size.height -= topOffset + safeInsets!.bottom
        }
        return theFrame
    }

Где я показываю оверлей в другом viewController, где я переопределяю метод

override func showOverlay() {
        self.overlayView.frame = self.contentFrame()
        self.view.addSubview(self.overlayView)
    }

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Вы можете использовать такое расширение.

extension UIDevice {
        var hasNotch: Bool {
            if #available(iOS 11.0, *) {
                let bottom = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0
                return bottom > 0
            } else {
                return false
            }
        }
    }
0 голосов
/ 10 января 2019

Я исправил это, используя мою реализацию. Я проверяю, имеет ли текущее устройство метку, и если она есть, я вычитаю 20 из нее. Затем добавьте 20 баллов, когда я вызываю метод

class var hasNotch: Bool {
        if #available(iOS 11.0, *) {
            return (self.shared.delegate!.window!!.safeAreaInsets.top > 20)
        }
        return false 
    }

func contentFrame(extraTopOffset pOffset: CGFloat = 0) -> CGRect {
        var theFrame = self.view.bounds
        if let navBar = self.navigationBar {
            let topOffset = navBar.frame.origin.y + navBar.frame.size.height
            theFrame.size.height -= topOffset
            theFrame.origin.y += topOffset
        }
        if #available(iOS 11.0, *) {
            let safeInsets = UIApplication.shared.delegate!.window!?.safeAreaInsets
            var extraOffset = safeInsets!.top - 20
            if UIApplication.yb_hasNotch {
                extraOffset -= pOffset
            }
            theFrame.origin.y += extraOffset
            theFrame.size.height -= extraOffset + safeInsets!.bottom
        }
        return theFrame
    }
...