如何在Swift

时间:2017-08-24 05:19:15

标签: ios swift uinavigationbar

更新:我最后隐藏了默认导航栏并添加了一个与导航栏相同的UIView。这可能听起来不错,但不是修补UINavigationBar,这很好。

这是我创建的自定义UINavigationBar类,用于增加应用中导航栏的高度。它对我不起作用。这是code

class PPBaseNavigationBar: UINavigationBar {

    ///The height you want your navigation bar to be of
    static let navigationBarHeight: CGFloat = 83.0

    ///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 = PPBaseNavigationBar.heightIncrease/2.0

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

    override func layoutSubviews() {
        super.layoutSubviews()

        let shift = PPBaseNavigationBar.heightIncrease/2.0

        ///Move the background down for [shift] point
        var classNamesToReposition: Array<String>?
        if #available(iOS 10.0, *) {
            classNamesToReposition = ["_UIBarBackground"]
        } else {
            classNamesToReposition =  ["_UINavigationBarBackground"]
        }

        for view: UIView in self.subviews {
            if (classNamesToReposition?.contains(NSStringFromClass(view.classForCoder)))! {
                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 = CGSize.init(width: amendedSize.width, height: PPBaseNavigationBar.navigationBarHeight)
        return newSize;
    }
}

所有方法都被调用,除了override func sizeThatFits(_ size: CGSize) -> CGSize {...}不确定,为什么?

4 个答案:

答案 0 :(得分:3)

It is not permissible to change the navigation bar object or modify its bounds, frame, or alpha values directly. 

Modifying the Navigation Bar Object Directly

您可以将自定义视图用作导航栏。根据您的要求自定义视图(例如更改高度)并将默认导航栏隐藏为

self.navigationController?.setNavigationBarHidden(true, animated: false)

答案 1 :(得分:1)

尝试这样,这在Swift 3中对我有用:

extension UINavigationBar {

    override open func sizeThatFits(_ size: CGSize) -> CGSize {
        return CGSize(width: UIScreen.main.bounds.size.width, height: "Your custom height")   
    }

}


// MARK: - View life cycle methods

class DVNavigationController: UINavigationController {

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        navigationBar.frame.size.height = "Your custom height"
    }

}

最后将此自定义UINavigationController课程分配给您的navigationController

答案 2 :(得分:1)

layoutSubviews 也可以覆盖func sizeThatFits(_ size:CGSize)。   所以不要担心,如果它不是sizeThatFits调用。我检查了layoutSubviews导航栏高度正在变化。

for view: UIView in self.subviews {
        if (classNamesToReposition?.contains(NSStringFromClass(view.classForCoder)))! {
            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 + 150.0
            view.frame = frame
        }
    }

答案 3 :(得分:0)

更改您的代码,如下所示

open override func sizeThatFits(_ size: CGSize) -> CGSize {
        let amendedSize:CGSize = super.sizeThatFits(size)
        let newSize:CGSize = CGSize.init(width: amendedSize.width, height: PPBaseNavigationBar.navigationBarHeight)
        return newSize;
    }

可能会为你工作。