web-dev-qa-db-ja.com

目標C:プログラムでセーフエリア内にself.viewを作成する方法

IOS 8以降のサポートからiOS 9以降のサポートにアプリを変更しました。

ビューを作成するのにストーリーボードを使用していないため、プログラムで"Use Safe Area Guides"オプションがあるのか​​、またはそのようなものがあるのか​​と思っていました。

ビューを固定しようとしましたが、iPhone Xシミュレーターで上下に重なり続けます。

13
Ravindhiran

これをObjective-Cで試してみてください:

UIView * myView = // initialize view using IBOutlet or programtically

myView.backgroundColor = [UIColor redColor];
myView.translatesAutoresizingMaskIntoConstraints = NO;

if (@available(iOS 11, *)) {
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
    [myView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
    [myView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
    [myView.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
    [myView.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;
} else {
    UILayoutGuide *margins = self.view.layoutMarginsGuide;
    [myView.leadingAnchor constraintEqualToAnchor:margins.leadingAnchor].active = YES;
    [myView.trailingAnchor constraintEqualToAnchor:margins.trailingAnchor].active = YES;
    [myView.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor].active = YES;
    [myView.bottomAnchor constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor].active = YES;

}

// Refresh myView and/or main view
[self.view layoutIfNeeded];
//[self.myView layoutIfNeeded];

参照元: プログラムでセーフエリアレイアウトを使用する-Swift

結果:

enter image description here

26
Krunal

プログラムでtopおよびbottom paddingを見つけることができます。これで問題が解決すると思います。

if (@available(iOS 11.0, *)) {
        UIWindow *window = UIApplication.sharedApplication.keyWindow;
        CGFloat topPadding = window.safeAreaInsets.top;
        CGFloat bottomPadding = window.safeAreaInsets.bottom;
}

編集:コメント(感謝、@ albert-renshaw)で述べたように、オブジェクトはviewDidLoadから描画できません。UIWindowにアクセスできないため、最初の実行時に少なくとも1つの実行ループの後まで。これをバイパスするには、いくつかの方法があります。

1。単にviewDidLoadコードを新しいメソッドpostViewDidLoadに移動して、以下を使用します。

[self performSelector:@selector(postViewDidLoad) withObject:nil afterDelay:0.0f];

...元のviewDidLoadメソッドでは、UIWindowにアクセスできます。

OR

2。オブジェクトの作成を囲みます

dispatch_async(dispatch_get_main_queue(), ^{
// your code here...
});
13
user6788419