UINavigationBar слишком низко при использовании UIScreen.main.bounds в качестве фрейма UIWindow - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю приложение для iOS, цель развертывания 12.1, swift 4.2. Приложение использует вид контейнера и имеет панель навигации в верхней части основных экранов, предпочтительно прямо под строкой состояния. В раскадровке на экране запуска я ограничил навигационную панель Bar.top безопасным.Area.Top. Это отлично работает. Но после того, как я установил containerViewController как rootViewController в AppDelegate, панель навигации, как я ограничил ее в Main.storyboard (Navigation Bar.top - Safe.Area.Top), появляется намного ниже, где она должна быть.

Единственный способ заставить панель навигации отображаться прямо под строкой состояния - это создать пользовательский фрейм для моего окна в AppDelegate с отрицательным значением y - и это определенно НЕ решение, с которым мне удобно .

Это, кажется, генерирует слишком низкое значение y:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        window = UIWindow(frame: UIScreen.main.bounds)
        let containerViewController = ContainerViewController()
        window!.rootViewController = containerViewController
        window!.makeKeyAndVisible()
        return true
    }

И это вопиющий хак, который приближает панель навигации к тому месту, где она должна быть:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        //window = UIWindow(frame: UIScreen.main.bounds)
        let hackedFrame = CGRect(x: 0, y: -44, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
        window = UIWindow(frame: hackedFrame)
        let containerViewController = ContainerViewController()
        window!.rootViewController = containerViewController
        window!.makeKeyAndVisible()
        //window!.windowLevel = UIWindow.Level.statusBar
        return true
    }

Снимки экрана:

launchscreen, navbar correct

main screen post didFinishLaunchingWithOptions, navbar too low

Я, наверное, здесь упускаю что-то действительно очевидное, но я был бы признателен за любую помощь, которую кто-либо может оказать.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

попробуйте добавить панель навигации в ViewController вместо AppDelegate, например:

var screenWidth : CGFloat!
var screenHeight : CGFloat!
let screenSize: CGRect = UIScreen.main.bounds

внутри ViewDidLoad:

screenWidth = screenSize.width
screenHeight = screenSize.height

navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 20, width: screenWidth, height: screenWidth / 3))

для добавления заголовка и кнопки:

view.addSubview(navigationBar)
    let navItem = UINavigationItem(title: "MainController")
    let doneItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.cancel, target: nil, action: #selector(DismissViewController))
    navItem.leftBarButtonItem = doneItem
    UINavigationBar.appearance().barTintColor = .white
    navigationBar.setItems([navItem], animated: false)
0 голосов
/ 12 апреля 2019

В iOS 11 Apple ввела большие заголовки на панели навигации, что означает, что ее можно растянуть, если потянуть. Вы должны попробовать установить

navigationItem.largeTitleDisplayMode = .never

В вашем viewDidLoad и установите для prefersLargeTitles панели навигации значение false

if #available(iOS 11.0, *) {
   navigationItem.largeTitleDisplayMode = .always
   navigationController?.navigationBar.prefersLargeTitles = true
} 
...