私は見つけられる類似の質問をすべて見てきましたが、この問題の解決策は見つかりませんでした。NavigationItemのtitleViewが正しくアニメーション化されていません
私はviewDidLoad
にこのようtitleView
プロパティを設定しています:
self.navigationItem.titleView = label
ビューコントローラがナビゲーションスタックの一部です。前のビューコントローラで行をタップすると、このコントローラがスタックにプッシュされます。完全に正常なUINavigationControllerのものです。
このビューコントローラがアニメーション化を開始すると、ラベルは原点(左上)に表示され、ビューコントローラがアニメーションを終了してから、アニメーションが途中で適切な位置にジャンプするまで残りますナビゲーションバー。
戻るボタンをタップすると、通常のタイトルと同様に、タイトルビューが正しくアニメーション表示されます。ここで
はviewDidLoad
のコードです:変更なし:
は枠を指定:私が試した
let label = UILabel(frame: CGRect.zero) label.textAlignment = .center label.translatesAutoresizingMaskIntoConstraints = false label.backgroundColor = .red label.text = "test" label.sizeToFit() self.navigationItem.titleView = label
物事
。私はフレームを指定したくありません。私はnav barの高さについて仮定したくありません。viewWillAppear
に移動:変更なし。viewDidAppear
に移動しました。アニメーションが完了するまでラベルが表示されず、表示される場所に表示されます。アニメーションが表示されないだけです。正しい動作は、通常のタイトルのように右から左にアニメーション化することです。
これは、XcodeのMaster-Detailプロジェクトテンプレートで簡単に再現できます。もしあなたがそれを試してみたいのであれば、上記のコードをconfigureView()
の先頭にDetailViewController.swift
で追加してください。そのテンプレートでは、ナビゲーション項目のタイトルはストーリーボードにハードコードされています。 「詳細」を検索すると簡単に削除できます。 Navigation Item: Title = "Detail"
という結果をクリックし、インスペクタペインから文字列を削除します。
更新
synndicateの提案@上記UILabel
例えば完璧に動作しません。しかし、私の本当の問題はUIStackView
です。 @synndicateのアプローチに従ったスタックビューを使用すると、もう一つのアニメーションの問題が発生することがわかります。今回は、タイトルビューがスライドインし始めますが、原点までアニメーションされます。アニメーションが終了すると、アニメーションは元の位置にスナップされます。 @synndicateが示唆するよう
ここで任意の更なる提案が...
let label = UILabel(frame: CGRect.zero)
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
label.backgroundColor = .red
label.text = "test"
let stackView = UIStackView(frame: CGRect.zero)
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.addArrangedSubview(label)
stackView.sizeToFit()
controller.navigationItem.titleView = stackView
prepare(for:sender:)
のコードですか?
また、これはXcode 8とiOS 10です。
アップデート2
IはNAV階層のルートがUINavigationController
あるビューコントローラのviewDidLoad
上記スタックビューコードは(普通のタイトルのようなもの)完全にアニメーション化することを発見しました。この問題は、nav階層のルートがUISplitViewController
である場合に発生します。
だから、私は、ナビゲーション階層のルートがUISplitViewController
あるnavigationItem
のtitleView
プロパティに設定されますUIStackView
を設定するにはどうすればよい
...私はこれに私の質問を更新ことができると思いますか?
それを追加し、ナビゲーションスタックの特定のビューコントローラに表示したい場合はこの時点で、私はあなたがあなたのtitleViewをそこに設定するところのUINavigationControllerをリファクタリングし、サブクラス化しなければならないことを示唆します。そして、後で ''準備する(:送信者) 'コールでは、プッシュされているコントローラに固有のテキストを設定することができます – synndicate