【问题标题】:iOS 10 custom navigation bar heightiOS 10 自定义导航栏高度
【发布时间】:2016-09-12 16:08:59
【问题描述】:

我实现了自定义导航栏高度,通过使用以下代码对其进行子类化

class TMNavigationBar: UINavigationBar {

    ///The height you want your navigation bar to be of
    static let navigationBarHeight: CGFloat = 44.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 = TMNavigationBar.heightIncrease/2

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

    override func layoutSubviews() {
        super.layoutSubviews()

        let shift = TMNavigationBar.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, TMNavigationBar.navigationBarHeight);
        return newSize;
    }
}

以下问题仅在 iOS 10 上出现:(栏和视图之间的黑色空间)

不知道那里发生了什么。但是在情节提要中它会生成此警告,并且无法在 IB 中修复它(警告仅在我更改 IB 中导航栏的子类时出现)。

【问题讨论】:

  • 情节提要警告是关于宽度,而不是高度。它与您的代码无关。 ——问题是什么?你说“跟随问题”,但你从来没有说它是什么
  • 请查看更新后的截图,它在视图和导航栏之间显示黑色空间
  • 那么是什么导致了黑色空间?导航栏的底部是否太高,或者视图的顶部是否太低?你有一个调试器。调试!在这种情况下,请使用视图调试器查看您的视图框架是什么。
  • 感谢@matt 的精彩建议,请检查我更新后的问题以及我找到的答案。
  • 您实际上可以将其作为答案而不是修改您的问题,两天后您可以接受您自己的答案。对于将来可能从您的工作中受益的其他人来说,这将是最有帮助的形式。

标签: ios swift storyboard uinavigationbar ios10


【解决方案1】:

适用于 iOS 10、Swift 3.0:

extension UINavigationBar {
    open override func sizeThatFits(_ size: CGSize) -> CGSize {
        let screenRect = UIScreen.main.bounds
        return CGSize(width: screenRect.size.width, height: 64)
    }
}

【讨论】:

  • 如何使用这个扩展功能?
  • @Hemang,把它放在你项目的空白 Extensions.swift 文件中(并在第一行添加import UIKit)。
【解决方案2】:

我检查了界面调试器,这就是我所看到的(所以基本上它是在尝试改变导航栏的高度,它保持不变并且只显示黑色空间 - 这是窗口颜色):

经过后来的调查,我注意到它没有调用:“_UINavigationBarBackground

然后我从快速枚举中检查了view.classForCoder,发现key变成了“_UIBarBackground”,所以我更新了layoutSubviews():

override func layoutSubviews() {
    super.layoutSubviews()

    let shift = TMNavigationBar.heightIncrease/2

    ///Move the background down for [shift] point
    let classNamesToReposition = isIOS10 ? ["_UIBarBackground"] : ["_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 {...}所以我看不到更新的高度?有什么想法吗?
  • 我为此创建了一个gist。请看一次。
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 2012-12-10
  • 2023-04-07
  • 2013-11-19
  • 2018-02-02
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
相关资源
最近更新 更多