navigationControllerのTitleViewを削除する

はじめに

NavigationBarのTitleのAlphaをいじりたい時や独自のCustomViewを設定した時TitleViewを使って配置します。

不要になった際に以下のようにtitleViewを消せたら良いんですが、残念ながら以下の処理ではTitleViewは消えてくれません

navigationController?.navigationBar.topItem?.titleView?.removeFromSuperview()

NavigationControllerの階層構造を知る

TitleViewを削除するためにまずはどの階層にTitleViewが追加されているのかを確認します。

ヒエラルキーを確認すると UINavigationBar > _UINavigationBarContentView > _UITAMICAdaptorView > TitleView のような構造で表示されていることがわかります。

TitleViewを削除する

TitleViewにたどり着くまでにAppleが隠蔽しているクラスを経由する必要があります。

_UINavigationBarContentViewや_UITAMICAdaptorViewの型を使うことができませんが、Swiftでは以下の処理でクラス名を知ることは可能なのでクラスメイト一致するViewを探っていきます。

String(describing: type(of: self)) 

以下の処理でTitleViewに到達することができるので削除することが可能です。

TitleViewの中が入れ子になっていてその中の一部だけ削除する場合などはこれ以下の階層を掘って行けば一部だけ削除することも可能だと思います。

navigationController?.navigationBar.subviews.filter { subView in
    return String(describing: type(of: subView.self)) == "_UINavigationBarContentView"
}.first?.subviews.filter { subView in
    return String(describing: type(of: subView.self)) == "_UITAMICAdaptorView"
}.first?.subviews.forEach { subView in
    subView.removeFromSuperview()
}