LoginSignup
0
1

More than 5 years have passed since last update.

UINavigationControllerのデフォルトの戻るボタンを除去する

Last updated at Posted at 2017-07-22

ナビゲーションコントローラーのデフォルト戻るボタンを排除

Storyboard設定

titleViewにボタンを配置していく。

タイトルのラベルの左右制約はボタン基準ではなく親ビューから60と指定。
理由は左右指定はボタンの幅でタイトルがセンタリングできない為。
ボタンのタイトルが長くなる場合はタイトルと重ならないような調整が必要。

この時もデフォルトの戻るが表示されちゃうけど、Storyboard上で表示しない方法ご存知の方いれば情報を頂けると嬉しいです。
m(_ _)m

こんな感じに
スクリーンショット 2017-07-23 8.03.21.png

制約

スクリーンショット 2017-07-23 8.05.24.pngスクリーンショット 2017-07-23 8.05.32.png

コード

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
    }
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1