1

私は見つけられる類似の質問をすべて見てきましたが、この問題の解決策は見つかりませんでした。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あるnavigationItemtitleViewプロパティに設定されますUIStackViewを設定するにはどうすればよい

...私はこれに私の質問を更新ことができると思いますか?

答えて

0

スタック上のビューコントローラを押す前にコードを移動できますか?

主従プロジェクト

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "showDetail" { 
      if let indexPath = tableView.indexPathForSelectedRow {      

       let object = objects[indexPath.row] as! NSDate 
       let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem 
       controller.navigationItem.leftItemsSupplementBackButton = true 

       let label = UILabel() 
       label.textAlignment = .center 
       label.backgroundColor = .red 
       label.text = "test" 
       label.sizeToFit() 

       controller.navigationItem.titleView = label 

      } 
     } 
    } 
+0

それを追加し、ナビゲーションスタックの特定のビューコントローラに表示したい場合はこの時点で、私はあなたがあなたのtitleViewをそこに設定するところのUINavigationControllerをリファクタリングし、サブクラス化しなければならないことを示唆します。そして、後で ''準備する(:送信者) 'コールでは、プッシュされているコントローラに固有のテキストを設定することができます – synndicate

0

MasterViewController.swiftであなたはstackViewは、単にあなたの更新に応じてビューコントローラに

self.view.addSubview(stackView) 
+0

正しいです。しかし、どこにも行かないのです。私はナビゲーション項目の 'titleView'でスタックビューを使用しようとしています。すべての詳細は上記です。 –

+0

なぜそれを 'titleView'として追加する必要がありますか? 'titleView'は、ナビゲーション中永続的なビューのためだけに使用されることを意図しています。 –

+0

ナビゲーションバーのタイトルに複数のラベルが必要です。私の理解は、それぞれのView ControllerはnavigationItemの 'titleView'を' title'のように設定できるということです。 –

関連する問題