9

これまで、プロパティtranslucent=YESのUINavigationBarでUINavigationControllerを使用していたアプリがあります。これは、UINavigationControllerのコンテンツビュー(つまり、プッシュしたView Controllerからのビュー)がフルスクリーン(ステータスバーを除く)であることを意味します。

ただし、navigationBar.translucent = NOに設定すると、不透明なナビゲーションバーの下にコンテンツは必要ないとAppleが想定しているため、このコンテナビューは44ポイント短くなります。

...私たちが行っていることを行っていて、スクロールして離れるナビゲーションバーを使用している場合を除きます(その方法については、この投稿を参照してください)。したがって、これが可能かどうかを知りたいと思います。

半透明=NOにしたいのですが、すべてがYESに設定されているかのように動作させます。私は半透明=YESの機能が好きですが、実際にはバーをUIKitで半透明にしたくありません。

4

4 に答える 4

19

私のために働いたのは追加することでし extendedLayoutIncludesOpaqueBars = trueviewDidLoad

このようなもの

override func viewDidLoad() {
   super.viewDidLoad()
   extendedLayoutIncludesOpaqueBars = true
}

それがあなたにもうまくいくことを願っています

于 2015-05-11T11:29:06.140 に答える
1

それは必ずしも良い答えではありませんが、半透明でない場合は、その高さで自分の見方を相殺することができます。

//This won't take into account orientation and probably other details
if(!self.navigationController.navigationBar.isTranslucent)
{
    self.view.frame = CGRectMake(0,0,-44,self.view.bounds.size.height);
}

これをviewDidLoadまたはviewWillAppearに配置できます。多数のビューコントローラがある場合は、それらすべてをサブクラス化して、ロジックをサブクラスに配置できます。

于 2012-11-05T19:58:57.337 に答える
0

それは確かに少しハックですが、私はうまくいく解決策を見つけました。

アイデアは、半透明のナビゲーションバーに不透明な裏地を付けることです。残念ながら、私はそれが汚れていてカプセル化されておらず、いくつかの潜在的な問題をもたらすという点で解決策に満足していませんが、それが仕事を成し遂げたので私は満足しています。

アプリケーションのベースビューコントローラークラス(つまり、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
}
于 2012-11-07T15:36:27.407 に答える
0

サブビューを(0,44)ではなく(0,0)にしたかったので(画面の境界に関して)、これに対する答えを探していましたが、これを設定する方法についての答えが見つかりませんでした含まれているプロパティになると思ったNavigationController。

非常に簡単なことでしたが、ナビゲーションバーの幅と高さであるサブビューをナビゲーションコントローラーに追加し、ナビゲーションバーの下にサブビューを挿入しました。

これで、設定は半透明= YESになりますが、それでもしっかりと表示され、サブビューは希望どおりに動作します。

編集:元の投稿を読み直した後、ナビゲーションバーをロールバックする場合は、ナビゲーションバーで同じことを行うのと同じように、新しいサブビューの非表示と表示を考慮する必要があると思います。

于 2013-01-21T16:15:05.430 に答える