それは確かに少しハックですが、私はうまくいく解決策を見つけました。
アイデアは、半透明のナビゲーションバーに不透明な裏地を付けることです。残念ながら、私はそれが汚れていてカプセル化されておらず、いくつかの潜在的な問題をもたらすという点で解決策に満足していませんが、それが仕事を成し遂げたので私は満足しています。
アプリケーションのベースビューコントローラークラス(つまり、MyViewController:UIViewController)のviewDidLoadメソッドで、新しいivar UIView * _navigationBarBGをインスタンス化し、self.navigationController.navigationBarと同じフレームを指定します。次に、backgroundColorプロパティを[UIColor whiteColor]に設定しますが、これは、私が推測するより多くの色合いを実現する方法です。[編集:純粋主義者になりたい場合(色の値は.psdから取得したままです)、_ navigationBarBGをUIImageViewにして、そこでカスタム背景を使用し、実際のUINavigationBarの背景を明確に描画することができます(または、通常の「インターネット上のどこかにある画像を使用してナビゲーションバーを変更する」レシピを使用する場合は、1pxの透明な画像を拡大します)]
if(self.navigationController)
{
_navigationBarBG = [[UIView alloc] initWithFrame: self.navigationController.navigationBar.frame];
_navigationBarBG.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_navigationBarBG];
}
次に(これはくだらない部分ですが、他の方法はわかりません)、このビューをサブビューとして追加します。ただし、通常は[self.view addSubview:anyView]を呼び出す場合は常に、[self.view insertSubview:anyViewbelowSubview:_navigationBarBG]を呼び出す必要があります。
if (_navigationBarBG)
[self.view insertSubview: anyView belowSubview:_navigationBarBG];
else
[self.view addSubview: anyView];
それを忘れると、これらの追加されたビューはナビゲーションバーの背景の下にスライドし、奇妙に見えます。したがって、これがエラーの原因であることを知っておく必要があります。
なぜ私はこれをしているのですか?繰り返しになりますが...テーブルビューを下にスクロールしたときに邪魔にならないようにスクロールするナビゲーションバーを用意して、ユーザーにより多くの画面スペースを提供できるようにしたいと思います。これは、scrollViewデリゲート(scrollViewDidScroll:)およびviewWillAppearを使用して実行されます。
// FIRST DEAL WITH SCROLLING NAVIGATION BAR
CALayer *layer = self.navigationController.navigationBar.layer;
CGFloat contentOffsetY = scrollView.contentOffset.y;
CGPoint newPosition;
if (contentOffsetY > _scrollViewContentOffsetYThreshold && self.scrollingNavigationBarEnabled) {
newPosition = CGPointMake(layer.position.x,
22 - MIN((contentOffsetY - _scrollViewContentOffsetYThreshold), 48.0)); // my nav bar BG image is 48.0 tall
layer.position = newPosition;
[_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens
}
else
{
newPosition = kNavBarDefaultPosition; // i.e. CGPointMake(160, 22) -- portrait only
layer.position = newPosition;
[_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens
}