Пользовательский UINavigationBar не учитывает данную высоту - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть пользовательский UINavigationBar, который называется MapNavBar. Этот класс объявлен следующим образом:

class MapNavBar: UINavigationBar {

override func sizeThatFits(_ size: CGSize) -> CGSize {
    let screenSize = UIScreen.main.bounds.size
    let landscape = screenSize.width > screenSize.height
    if landscape {
        let navBarHeight: CGFloat = 44.0
        return CGSize(width: screenSize.width, height: navBarHeight)
    }
    return super.sizeThatFits(size)
}

}

Пользовательская панель навигации назначается контроллеру навигации следующим образом:

navController.setValue(MapNavBar(), forKeyPath : "navigationBar")

Теперь, когда ориентация меняется на альбомную, я бы хотел, чтобы высота панели навигации была равна стандартной (книжной ориентации) высоте 44. Поэтому в представлении MapController я делаю: WillLayoutSubviews:

override func viewWillLayoutSubviews() {

    if let navController = ... {
        let screenSize = UIScreen.main.bounds.size
        let landscape = screenSize.width > screenSize.height
        if landscape {
            let navBarHeight = navController.navigationBar.sizeThatFits(screenSize).height

            // Resize navBar
            navController.navigationBar.frame = CGRect(x: 0, y: 0, width: Int(screenSize.width), height: Int(navBarHeight))
        }
    }
    super.viewWillLayoutSubviews()
}

Несмотря на все усилия, высота пользовательской панели навигации остается равной 32 точкам в альбомной ориентации. Я проверил, и свойство navigationBar контроллера навигации действительно является экземпляром моего пользовательского MapNavBar.

Кто-нибудь знает, почему это происходит и как это исправить?

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

Попробуйте это:

class MapNavBar: UINavigationBar {

    let navBarHeight: CGFloat = 64 //44 + 20 Where 20 is for status bar, it is hidden in landscape mode always

    override func sizeThatFits(_ size: CGSize) -> CGSize {

        let frame = self.frame
        let screenSize = UIScreen.main.bounds.size
        let landscape = screenSize.width > screenSize.height
        if landscape {
            return CGSize(width: frame.width, height: navBarHeight)
        }
        return super.sizeThatFits(size)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        let screenSize = UIScreen.main.bounds.size
        let landscape = screenSize.width > screenSize.height
        if landscape {
            let y = UIApplication.shared.statusBarFrame.height
            frame = CGRect(x: frame.origin.x, y:  y, width: frame.size.width, height: navBarHeight)

            for subview in self.subviews {
                var stringFromClass = NSStringFromClass(subview.classForCoder)
                if stringFromClass.contains("BarBackground") {
                    subview.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: navBarHeight)
                    subview.backgroundColor = self.backgroundColor
                }

                stringFromClass = NSStringFromClass(subview.classForCoder)
                if stringFromClass.contains("BarContent") {
                    subview.frame = CGRect(x: subview.frame.origin.x, y: 0, width: subview.frame.width, height: navBarHeight)
                    subview.backgroundColor = self.backgroundColor
                }
            }
        }
    }
}

enter image description here

...