web-dev-qa-db-ja.com

iOS10カスタムナビゲーションバーの高さ

次のコードでサブクラス化することにより、カスタムナビゲーションバーの高さを実装しました

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;
    }
}

次の問題はiOS10でのみ発生します:(バーとビューの間の黒いスペース)

enter image description here

そこで何が起こっているのか分かりません。しかし、ストーリーボードではこの警告が生成され、IBで修正する方法はありません(警告は、IBでナビゲーションバーのサブクラスを変更した場合にのみ表示されます)。

enter image description here

8
ignotusverum

インターフェイスデバッガーを確認しましたが、これが表示されます(基本的に、ナビゲーションバーの高さを変更しようとしていますが、ビットは同じままで、ウィンドウの色である黒いスペースだけが表示されています):

enter image description here

後の調査で、私はそれが呼び出していないことに気づきました: "_UINavigationBarBackground "

次に、高速列挙からview.classForCoderを確認したところ、キーが「_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
        }
    }
}

乾杯。

11
ignotusverum

IOS10で動作します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)
    }
}
15
Deniss Fedotovs