私はiOS7のUIの移行についてたくさん読んでいます。
私はどのようなこれらの3つのプロパティを取得することはできませんよautomaticallyAdjustsScrollViewInsets
、extendedLayoutIncludesOpaqueBars
、edgesForExtendedLayout
?
たとえば、ビューコントローラをステータスバーの下から開始しようとしていますが、達成できません。
私はiOS7のUIの移行についてたくさん読んでいます。
私はどのようなこれらの3つのプロパティを取得することはできませんよautomaticallyAdjustsScrollViewInsets
、extendedLayoutIncludesOpaqueBars
、edgesForExtendedLayout
?
たとえば、ビューコントローラをステータスバーの下から開始しようとしていますが、達成できません。
回答:
iOS7以降、ビューコントローラーはデフォルトで全画面レイアウトを使用します。同時に、ビューのレイアウト方法をより詳細に制御できます。これは、次のプロパティで行われます。
edgeForExtendedLayout
基本的に、このプロパティでは、ビューのどちら側を拡張して画面全体をカバーできるかを設定します。をにプッシュすると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
ナビゲーションバーが終了するとテーブルがスクロールし始め、その後ろに移動しないため、[なし] に設定しても機能しません。
ここでこのプロパティが役に立ちます。ビューコントローラーにインセットを自動的に調整させると(このプロパティをYESに設定し、デフォルト値も)、インセットがテーブルの上部に追加されるため、テーブルはナビゲーションの開始位置になりますバーは終了しますが、スクロールは画面全体をカバーします。
これは、NOに設定されている場合です。
そしてYES(デフォルト):
どちらの場合も、テーブルはナビゲーションバーの後ろにスクロールしますが、2番目の場合(YES)は、ナビゲーションバーの下から始まります。
extendedLayoutIncludesOpaqueBars
この値は、前の値への単なる追加です。デフォルトでは、このパラメーターはNOに設定されています。ステータスバーが不透明の場合、ビューを拡張してステータスバーをカバーしても(edgesForExtendedLayout
までUIRectEdgeAll
)、ビューはステータスバーを含むように拡張されません。
値をYESに設定すると、ビューが再びステータスバーの下に移動できるようになります。
不明な点があればコメントを書いてお答えします。
iOSはどのUIScrollViewを使用するかをどのようにして知るのですか?
iOSは、ViewControllerのビューの最初のサブビュー(インデックス0のサブビュー)を取得し、それがのサブクラスの場合、Explain UIScrollView
されたプロパティをそれに適用します。
もちろん、これはUITableViewController
デフォルトで機能することを意味します(UITableView
が最初のビューであるため)。
ストーリーボードを使用しているかどうかはわかりませんが、使用している場合は、ビューコントローラーをステータスバーの下(下のバーの上)から開始するには、次のようにします。
IBでビューコントローラーを選択します。属性インスペクターで、[エッジの延長-上部バーの下]および[エッジの延長-下部バー]の選択を解除します。
私はストーリーボードを使用しており、上記のアドバイスを使用してうまくいきましたが、それを実装する方法が正確にわかりませんでした。以下は、推奨されるソリューションをViewControllerに配置することで問題を解決する方法の短い例です。
import Foundation
import UIKit
// This ViewController is connected to a view on a storyboard that
// has a scrolling sub view.
class TheViewController: UIViewController {
// Prepares the view prior to loading. Putting it in viewDidAppear didn't work.
override func viewWillAppear(animated: Bool) {
// this method is an extension of the UIViewController
// so using self works as you might expect.
self.automaticallyAdjustsScrollViewInsets = false
// Default is "true" so this sets it to false tells it to use
// the storyboard as you have it placed
// and not how it thinks it should place it.
}
}
私の問題:自動調整がデフォルトでtrueに設定されているため、ストーリーボードのデザインとシミュレーターに違いが生じます
解決済み:上記のコードが適用され、自動調整がオフになりました。
この行を追加してこの問題を解決しましたが、私の問題はに関連してUIView
いました。UIScrollView
self.navigationController.navigationBar.translucent = NO;
automaticallyAdjustsScrollViewInsets
プロパティは、何らかのスクロールビュー(テーブルビュー、コレクションビューなど)が次のいずれかである場合にのみ機能することを覚えておいて
ください。
他の提案では、最初のサブビューであっても機能しませんが、ビュー階層には他のスクロールビューがあります。
編集(拡張子DIY)
これらの条件を満たせなくても同様の動作が必要な場合(スクロールビューの下に背景画像があるなど)、スクロールビューインセットを手動で調整できます。しかし、SOの周りで多くの人が提案しているように、44や64、20のように一定に設定しないでください。あなたはこれまでサイズを知ることができません。incall / gps / audio通知があり、ナビゲーションバーは常に44ポイントである必要はありません。
最良の解決策は、didLayoutSubviews length
でlayoutGuide を使用することです。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentInset = UIEdgeInsets(top: topLayoutGuide.length, left: 0, bottom: 0, right: 0)
scrollView.scrollIndicatorInsets = scrollView.contentInset
}
同じ方法でbottomLayoutGuideを使用できます。