ナビゲーションコントローラーのデフォルト戻るボタンを排除
Storyboard設定
titleViewにボタンを配置していく。
タイトルのラベルの左右制約はボタン基準ではなく親ビューから60と指定。
理由は左右指定はボタンの幅でタイトルがセンタリングできない為。
ボタンのタイトルが長くなる場合はタイトルと重ならないような調整が必要。
この時もデフォルトの戻るが表示されちゃうけど、Storyboard上で表示しない方法ご存知の方いれば情報を頂けると嬉しいです。
m(_ _)m
制約
コード
UINavigationControllerのサブクラスで戻るボタンの非表示とタイトルビューのサイズ調整を実装。
///
/// CstmNV - 戻るボタン非表示
///
class CstmNC: UINavigationController {
///
// MARK: ------------------------------ life cycle
///
///
///
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
super.pushViewController(viewController, animated: animated)
///
/// デフォルトの戻るボタンを非表示
///
viewController.navigationItem.backBarButtonItem = nil
viewController.navigationItem.hidesBackButton = true
}
}
///
// MARK: ------------------------------ UINavigationBarDelegate
///
///
///
extension CstmNC: UINavigationBarDelegate {
///
///
///
func navigationBar(_ navigationBar: UINavigationBar, shouldPush item: UINavigationItem) -> Bool {
///
/// サイズを調整 - ここでitemに対して戻るボタンの非表示をしようとしても上手くいかなかったのでpushViewController側で実装
///
item.titleView?.frame = navigationBar.frame
return true
}
}
以上。
追記@2017/07/25
何故かXcode9 bata4、iOS11から上手くいかなくなったので修正。
ついでに、UINavigationBarDelegateではなくてpushViewControllerにtitleViewのframe設定を移動。
iOS11からtitleViewも制約指定しないとダメになった?
ただ、iOS10でtitleViewへ制約設定しようとすると怒られるのでiOS11以降のみ制約設定。
///
/// CstmNV - 戻るボタン非表示
///
class CstmNC: UINavigationController {
///
// MARK: ------------------------------ life cycle
///
///
///
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
///
/// デフォルトの戻るボタンを非表示
///
self.visibleViewController?.navigationItem.backBarButtonItem = nil
self.visibleViewController?.navigationItem.hidesBackButton = true
///
/// titleViewに制約設定
///
if #available(iOS 11.0, *) {
if let v: UIView = self.visibleViewController?.navigationItem.titleView {
v.translatesAutoresizingMaskIntoConstraints = false
///
///
vとv.superview?に対して制約設定
iOS10と合わせるなら上下0、左右8の制約を指定すればOK
///
///
v.superview?.layoutIfNeeded()
}
}
}
///
///
///
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
super.pushViewController(viewController, animated: animated)
///
/// デフォルトの戻るボタンを非表示
///
viewController.navigationItem.backBarButtonItem = nil
viewController.navigationItem.hidesBackButton = true
viewController.navigationItem.titleView?.frame = self.navigationBar.frame
}
}