13

UINavigationController の上に UILabel を表示しようとしています。問題は、UILabel を UIWindow のサブビューとして追加すると、UIViewController のサブビューではないため、自動的に回転しないことです (UIViewController は、回転中にサブビューの更新を自動的に処理します)。

これは私が使用していた階層です:

  • UIウィンドウ
    • UIラベル
    • UINavigationController

したがって、次の階層を使用できると考えていました。

  • UIウィンドウ
    • UIViewController
      • UIView
        • UIラベル
        • UINavigationController

このようにして、ラベルは UIViewController のサブビューであるため、自動的に回転しながら UINavigationController のバーの上に表示できます。

問題は、UINavigationController をビューのサブビューとして追加しようとしたときです。

[myViewController.view addSubview:myNavigationController.view];

20 ピクセル下に表示されます。私が推測しているのは、ステータスバー用のスペースを確保する必要があると考えているためです。しかし、UINavigationController はステータス バーの上にオーバーレイしない UIView 内に配置されているため、誤って 20 ピクセルが追加されています。つまり、UINavigationBar の上部は、画面の 20 ピクセルではなく 40 ピクセル マークにあります。

UINavigationController とそのすべての要素 (ナビゲーション バー、ツールバー、ルート ビュー コントローラーなど) を 20 ピクセル上に移動する簡単な方法はありますか? または、ステータス バーを補うべきではないことを知らせるには?

そうでない場合は、上記の最初の階層を使用して、ナビゲーション バーの回転と一致するようにラベルを回転させる方法を理解する必要があると思います。これを行う方法に関する詳細情報はどこにありますか?

注:「ナビゲーションバーの上にラベルを表示する」とは、ナビゲーションバーの上に重ねる必要があることを意味します...単純にバーボタンアイテムにラップして、のアイテムの1つとして配置することはできませんナビゲーションバー。

4

5 に答える 5

18

このコードの使用はうまくいくようです:

nav.view.frame = CGRectMake(nav.view.frame.origin.x, nav.view.frame.origin.y - 20,
                          nav.view.frame.size.width, nav.view.frame.size.height);

ナビゲーションコントローラーをサブビューとして追加する前に、これを行いました。ハードコードされた20の代わりに[UIApplicationsharedApplication].statusBarFrameを使用することも、おそらく良い考えです。

それが最善の方法かどうかはわかりませんが。

于 2010-03-26T23:29:38.613 に答える
2

オリジンに値を追加する代わりに、App Frame を使用しないのはなぜですか? 私は使用することを意味します:

CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

参照フレームとして、次のようにします。

nav.view.frame = CGRectMake(appFrame.origin.x, appFrame.origin.y, ...

これは私のために働いた。

于 2011-10-31T22:54:14.400 に答える
2

利用可能なコンテンツ領域を表すフレームが必要な場合は、次を使用する必要があります[[UIScreen mainScreen] applicationFrame]。もちろん、これによりトップレベルのView Controllerが制限され、トップレベルのみになるようになります。だからまだちょっと危険ですが、それほどではありません。

于 2010-09-23T00:54:30.327 に答える
0

私は実際にこれと同じ問題を抱えていましたが、なんとか修正しました。

ビューコントローラーのビューには正しいフレームがありましたが、ビューコントローラーのナビゲーションバーにはありませんでした (フレームの原点が (0,20) でした)。

これを、ナビゲーション コントローラーのスーパービューであるビューのコントローラーに挿入します。

- (void) viewDidAppear:(BOOL)animated {
    if (navigationController.navigationBar.frame.origin.y != 0) {
        [[navigationController view] removeFromSuperview];
        [[self view] addSubview:navigationController.view];
    }
}
于 2012-04-17T08:59:35.307 に答える