Leeroy Jenkins
Leeroy Jenkins

Reputation: 253

Navigation bar title and navigation buttons not appearing on iOS 11

Prior to iOS 11, the UINavigationBar buttons and title are being displayed correctly.

Yesterday I downloaded Xcode 9 with iOS 11 and, after building and running without doing changes, both navigation buttons and the title are not being displayed anymore. It shows the UINavigationBar with the correct color I am setting but nothing else.

I tried on different simulators and also I updated an iPhone 7 to iOS 11 beta 5 and the result is the same. Nothing being displayed.

Has someone faced the same problem? I have tried changing different parts of the code and storyboard but nothing affects...

EDIT with screenshots: https://i.sstatic.net/oVPB3.jpg

Thanks in advance!

Upvotes: 22

Views: 7863

Answers (11)

Shawn
Shawn

Reputation: 443

I found this code in some inherited codebase, commented it out and everything worked as it did before iOS 11.x.

if (appDelegate.window.rootViewController != self) {
    appDelegate.window.rootViewController = self;
}

Upvotes: 1

Carly O'Keefe
Carly O'Keefe

Reputation: 21

use sizeToFit()! ios 11 automatically sizes it, but ios 10 does not

Upvotes: 2

Casey
Casey

Reputation: 211

We were facing the same issue where the navigation bar color is there but the title and the buttons are not showing up. We have double checked the bar was there by triggering a navigation bar background color change 2 seconds after the navigation controller showed up on the screen, so we know the navigation bar was there and we were adding buttons to the correct instance. Same as the OP, this issue only appears on iOS 11 and not iOS 10, and we are using Swift 3.2 running Xcode 9.1.

After hours of fiddling around, it turns out that presenting a navigation controller, then making it as the UIApplication.shared.delegate.window.rootViewController (after the present animation) caused the issue in our case.

If you just skip the present view controller and make the navigation controller as the root view controller, then everything works fine. Of course, you lose the present animation in the case.

Upvotes: 0

Alexander Telegin
Alexander Telegin

Reputation: 714

Based on the Justin Vallely's comment I've reworked the code a little to ensure proper sizing of the view:

class NavigationBarTitleView: UIView {
    private var width: CGFloat = 0.0
    private var height: CGFloat = 0.0

    override init(frame: CGRect) {
        super.init(frame: frame)
        width = frame.width
        height = frame.height
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override var intrinsicContentSize: CGSize {
        return CGSize(width: width, height: height)
    }
}

In my particular case I've used this view as a container to UISearchBar and now it is well sized and worked perfectly with Swift 4 & iOS 11, just as it used to work on previous iOS & Swift versions

Upvotes: 0

rtamesis
rtamesis

Reputation: 11

I had the same problem in my project where the titles were missing from the navigation bars after updating to Xcode 9 and iOS 11. I solved it by going to the navigation bar of my navigation controller on the storyboard, keeping the Prefers Large Titles unchecked and changing the Title Font under Title Text attributes, which was set by default in Xcode 9 to System 0 to some other option like Caption 1 or Headline. I also changed its children viewcontrollers' navigation bar settings For Large Title to Never instead of Automatic or Always.

Upvotes: 1

Rafael Machado
Rafael Machado

Reputation: 655

I had that same issue and none of the above fixed. Although, @Justin Vallely lead to me fix it.

All I did was to set a width on the titleView and everything worked just fine!

EDIT:

Every UIViewController has a navigationItem property, and every navigationItem has an optional titleView.

For reference: https://developer.apple.com/documentation/uikit/uinavigationitem/1624935-titleview

In my case, I was using a custom titleView and I think that's the cause of the problem, since Apple changed the API to support the new navigation bar layout.

Upvotes: 0

pereckeSokSzam
pereckeSokSzam

Reputation: 111

Had the same issue with the navigationButton not displayed. I solved it by setting the renderingMode to .alwaysOriginal. (I didn't use templates)

Swift 3 code:

var img =R.image.smt()?.withRenderingMode(.alwaysOriginal)

Upvotes: 0

Justin Vallely
Justin Vallely

Reputation: 6089

For Xcode 9, it appears that it is no longer enough to just set the frame of a custom view that is being injected into the navigationItem titleView. The intrinsic content size of your titleView now must be overriden and set as well.

Here's the code, adjust the width and height to suit your needs:

class NavigationBarTitleView: UIView {

    override var intrinsicContentSize: CGSize {
        return CGSize(width: bounds.width - 100, height: 50)
    }

    ...

}

Upvotes: 3

Phong Cao
Phong Cao

Reputation: 21

Did you set "window,rootViewController = ..." in your code ? Try remove it can fix your problem

Upvotes: 1

massimobio
massimobio

Reputation: 818

I had the same issue and for me it was caused by subclassing UITabBarController

Upvotes: 1

jerrygdm
jerrygdm

Reputation: 450

Try to use:

        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

or without appearance proxy setting directly to the current navigationBar...It solves my problem, should Apple changed titleText to clear as default in iOS11...?

Also use this if you want the same look as iOS 10:

        if #available(iOS 11, *) {
        nav.navigationBar.prefersLargeTitles = false
    }

Upvotes: 0

Related Questions