Can't set titleView in the center of navigation bar because back button

前端 未结 10 1509
情话喂你
情话喂你 2020-12-08 02:25

I\'m using an image view to display an image in my nav bar. The problem is that I can\'t set it to the center correctly because of the back button. I checked the related que

相关标签:
10条回答
  • 2020-12-08 02:55

    If you're using a custom view from a nib, be sure to disable auto-layout on the nib file.

    0 讨论(0)
  • 2020-12-08 02:55

    I created a custom UINavigationController that after dropping in, the only thing you have to do is call showNavBarTitle(title:font:) when you want to show and removeNavBarTitle() when you want to hide:

    class NavigationController: UINavigationController {
    
        private static var mTitleFont = UIFont(name: <your desired font (String)> , size: <your desired font size -- however, font size will automatically adjust so the text fits in the label>)!
        private static var mNavBarLabel: UILabel = {
    
            let x: CGFloat = 60
            let y: CGFloat = 7
            let label = UILabel(frame: CGRect(x: x, y: y, width: UIScreen.main.bounds.size.width - 2 * x, height: 44 - 2 * y))
    
            label.adjustsFontSizeToFitWidth = true
            label.minimumScaleFactor = 0.5
            label.font = NavigationController.mTitleFont
            label.numberOfLines = 0
            label.textAlignment = .center
    
            return label
        }()
    
        func showNavBarLabel(title: String, font: UIFont = mTitleFont) {
            NavigationController.mNavBarLabel.text = title
            NavigationController.mNavBarLabel.font = font
            navigationBar.addSubview(NavigationController.mNavBarLabel)
        }
    
        func removeNavBarLabel() {
            NavigationController.mNavBarLabel.removeFromSuperview()
        }
    }
    

    I find the best place to call showNavBarTitle(title:font:) and removeNavBarTitle() are in the view controller's viewWillAppear() and viewWillDisappear() methods, respectively:

    class YourViewController: UIViewController {
    
        func viewWillAppear() {
            (navigationController as! NavigationController).showNavBarLabel(title: "Your Title")
        }
    
        func viewWillDisappear() {
            (navigationController as! NavigationController).removeNavBarLabel()
        }
    }
    
    0 讨论(0)
  • 2020-12-08 03:05

    UINavigationBar automatically centers its titleView as long as there is enough room. If the title isn't centered that means that the title view is too wide to be centered, and if you set the backgroundColor if your UIImageView you'll see that's exactly what is happening.

    The title view is too wide because that navigation bar will automatically resize the title to hold its content, using -sizeThatFits:. This means that your title view will always be resized to the size of your image.

    Two possible fixes:

    1. The image you're using is way too big. Use a properly sized 44x44 pt image with 2x and 3x versions.

    2. Wrap UIImageView inside of a regular UIView to avoid resizing.

    Example:

    UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpeg"]];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    
    UIView* titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
    imageView.frame = titleView.bounds;
    [titleView addSubview:imageView];
    
    self.navigationItem.titleView = titleView;
    
    0 讨论(0)
  • 2020-12-08 03:05

    An example in Swift 3 version of Darren's second way:

    let imageView = UIImageView(image: UIImage(named: "test"))
        imageView.contentMode = UIViewContentMode.scaleAspectFit
    let titleView = UIView(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
        imageView.frame = titleView.bounds
        titleView.addSubview(imageView)
    
    self.navigationItem.titleView = titleView
    
    0 讨论(0)
提交回复
热议问题