1. ホーム
  2. アイオス

[解決済み】iOS7でのautomaticallyAdjustsScrollViewInsets、extendedLayoutIncludesOpaqueBars、edgesForExtendedLayoutの違いについて説明する。

2022-04-01 12:22:41

質問

iOS7のUI変更について、いろいろ読んでいます。

以下の3つのプロパティを取得することができません。 automaticallyAdjustsScrollViewInsets , extendedLayoutIncludesOpaqueBars , edgesForExtendedLayout ??

例えば、ビューコントローラーをステータスバーの下から起動するようにしたいのですが、実現できません。

どうすればいいですか?

iOS7から、ビューコントローラーはデフォルトでフルスクリーンレイアウトを使用するようになりました。同時に、そのビューをどのようにレイアウトするかについて、より多くの制御が可能になり、それはそれらのプロパティで行われます。

EdgesForExtendedLayout

基本的に、このプロパティで、画面全体をカバーするために、ビューのどの辺を拡張できるかを設定します。例えば UIViewController の中に UINavigationController . そのビューコントローラのビューがレイアウトされるとき、ナビゲーションバーが終わるところから始まりますが、このプロパティは、画面全体を埋めるためにビューのどの辺(上、左、下、右)を拡張できるかを設定します。

例で見てみましょう。

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

の値を設定しない。 edgesForExtendedLayout したがって、デフォルト値が使用されます ( UIRectEdgeAll ) のため、ビューは画面全体を埋めるようにレイアウトを拡張します。

これがその結果です。

ご覧のように、赤い背景がナビゲーションバーとステータスバーの後ろに広がっています。

では、その値を UIRectEdgeNone つまり、画面を覆うようにビューを拡張しないよう、ビューコントローラに指示しています。

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

そして、その結果。


automaticallyAdjustsScrollViewInsetsを使用します。

このプロパティは、ビューが UIScrollView などのように UITableView . テーブルの開始位置はナビゲーションバーが終わる位置にしたい。そうしないとコンテンツ全体が見えないからだが、同時に、スクロールしたときにテーブルが画面全体を覆うようにしたい。このような場合 edgesForExtendedLayout を None に設定しても、テーブルのスクロールはナビゲーションバーが終了したところから始まり、その後ろに移動しないため、うまくいきません。

ビューコントローラがインセットを自動的に調整するようにすると(このプロパティをYESに設定、デフォルト値でもある)、テーブルの上部にインセットが追加されます。

NOに設定されている場合です。

そしてYES(デフォルト)。

どちらの場合も、テーブルはナビゲーションバーの後ろにスクロールしますが、2番目のケース(YES)では、ナビゲーションバーの下から開始されます。


extendedLayoutIncludesOpaqueBars

この値は、これまでのものに追加されるだけです。デフォルトでは、このパラメータはNOに設定されています。ステータスバーが不透明な場合、ステータスバーをカバーするようにビューを拡張しても、ビューは拡張されません ( edgesForExtendedLayout から UIRectEdgeAll ).

YESに設定すると、ビューが再びステータスバーの下に入ることができるようになります。

何か不明な点があれば、コメントを書いていただければ、お答えします。

iOSはどのUIScrollViewを使用するかをどのようにして知るのですか?

iOS は ViewController のビューの最初のサブビュー、つまりインデックス 0 のものを取得し、もしそれが UIScrollView に、説明したプロパティを適用します。

もちろん、このことは UITableViewController はデフォルトで機能します(なぜなら UITableView が最初のビューになります)。