ビューをスタンドアロンの Xib ファイルとして作成し、それらをインスタンス化してサブビューとして追加するのが好きです。
したがって、 を使用する場合UINavigationBar、最初にカスタム ビューを作成し (Xib から)、それをカスタム ビューとして に追加することで、同じことができると期待していましたUIBarButtonItem。
UIBarButtonItem *anItem = [[UIBarButtonItem alloc] initWithCustomView:_myCustomView];
次に、ナビゲーション バーに追加します。
self.navigationBar.topItem.rightBarButtonItems = @[ anItem, anotherItem ];
ここまでは順調ですね。
現在、_myCustomViewAuto Layout (AL) を使用していますが、これで問題ないと思いました。そうではありません。私はほぼすべてを試しました。何も機能していません。ナビゲーションバーを持つコントローラーのサブビューとしてカスタムビューを追加してみました。ビュー階層の兄弟と考えて、AL はそれを の外側の通常のビューとして扱いますUINavigationBar。
それもうまくいきませんでした。コントローラーupdateViewConstraintsが呼び出されましたが、適用されませんでした。ビューの最初のフレームは のままでしたCGRectZero。あたかも AL がビューが の上にありUINavigationBar、兄弟であることを認識し、レイアウトする必要がないと判断したかのようです。
bringSubviewToFrontもちろん、、、なども試しましtranslatesAutoresizingMaskIntoConstraintstranslatesAutoresizingMaskIntoConstraintsた。後者は素敵を与えました:
キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: '-layoutSubviews の実行後も自動レイアウトが必要です。-layoutSubviews の MyNavigationBar の実装では、super を呼び出す必要があります。
問題は、Xib から AL を使用してカスタム ビューをロードし、これを に正常に設定した人customViewはいUIBarButtonItemますか? もしそうなら、どのように?