iOS 8 Swift Xcode 6 - 设置顶部导航栏背景颜色和高度

iOS 8 Swift Xcode 6 - Set top nav bar bg color and height

我到处查看并测试了发布在 Stack 上的所有代码片段,但没有一个对我有用,因为我需要它工作。

我只想设置:

我正在与 iOS8、Xcode 6 和 Swift 合作。

非常感谢您的明确回答!

这是我在 ViewController.swift

中的代码
// Set nav bar height

    navigationController?.navigationBar.frame.origin.y = -10

    // Set nav bar bg color

    var navBarColor = UIColor(red: 4 / 255, green: 47 / 255, blue: 66 / 255, alpha: 1)

    navigationController?.navigationBar.barTintColor = navBarColor

    // Set nav bar logo

    let navBarImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))

    navBarImageView.contentMode = .ScaleAspectFit

    let navBarImage = UIImage(named: "navBarLogo.png")

    navBarImageView.image = navBarImage

    navigationItem.titleView = navBarImageView

导航栏高度:

在自定义导航控制器子类中...

这个技巧是不改变导航栏的实际高度,而是调整它的原点。

func viewDidLoad() {
    super.viewDidLoad()

    navigationBar.frame.origin.y = -10 
}

RGB 中的导航栏背景颜色:

在自定义导航控制器子类中...

func viewDidLoad() {
    super.viewDidLoad()

    navigationBar.barTintColor = // YOUR COLOR
}

或者使用外观代理

UINavigationBar.appearance().barTintColor = // YOUR COLOR

导航栏居中徽标

在自定义视图控制器中...

func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.titleView = UIImageView(image: // YOUR LOGO)
}

应用接受的答案中的代码后,高度似乎根本没有改变..

这不是一件容易的事...我在网上调查了几篇文章(其中大部分在 Objective-C)。

最有用的是这个:http://www.emdentec.com/blog/2014/2/25/hacking-uinavigationbar

但是它最终的解决方案并没有把物品放在中间,也不在Swift。

所以我在Swift.中提出了一个可行的版本希望它能帮助一些人因为我得救了所以许多宝贵的时间。

Swift中的解决方案:

以下代码将解决您可能遇到的一些问题:

  • 标题和项目没有放在导航栏的中间
  • 当用户在视图控制器之间导航时,标题和项目会闪烁

您需要首先子class UINavigationBar,然后在故事板中 select 导航栏元素,然后在 "Identity Inspector" 选项卡,将新的 class 设置为自定义 Class

import UIKit

class UINavigationBarTaller: UINavigationBar {
    ///The height you want your navigation bar to be of
    static let navigationBarHeight: CGFloat = 64

    ///The difference between new height and default height
    static let heightIncrease:CGFloat = navigationBarHeight - 44

    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

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

    private func initialize() {
        let shift = UINavigationBarTaller.heightIncrease/2

        ///Transform all view to shift upward for [shift] point
        self.transform =
            CGAffineTransformMakeTranslation(0, -shift)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        let shift = UINavigationBarTaller.heightIncrease/2

        ///Move the background down for [shift] point
        let classNamesToReposition: [String] = ["_UINavigationBarBackground"]
        for view: UIView in self.subviews {
            if classNamesToReposition.contains(NSStringFromClass(view.dynamicType)) {
                let bounds: CGRect = self.bounds
                var frame: CGRect = view.frame
                frame.origin.y = bounds.origin.y + shift - 20.0
                frame.size.height = bounds.size.height + 20.0
                view.frame = frame
            }
        }
    }

    override func sizeThatFits(size: CGSize) -> CGSize {
        let amendedSize:CGSize = super.sizeThatFits(size)
        let newSize:CGSize = CGSizeMake(amendedSize.width, UINavigationBarTaller.navigationBarHeight);
        return newSize;
    }
} 

我的要点也是:https://gist.github.com/pai911/8fa123d4068b61ad0ff7

iOS 10 更新:

不幸的是,此代码在iOS10中中断,有人帮助修复它,给您:

iOS 10 custom navigation bar height

需要说明的是,这段代码有点老套,因为它依赖于导航栏的内部结构...因此,如果您决定使用它,请做好准备应对可能会破坏此代码的任何即将发生的更改。 .

来自 Bon Bon!

的精彩回答

在 Swift 3 中,但是请确保替换

let classNamesToReposition: [String] = ["_UINavigationBarBackground"]

let classNamesToReposition: [ String ] = [ "_UIBarBackground" ]

否则不行