目标C:如何以编程方式在Safe Area中创建self.view

时间:2017-11-02 12:42:37

标签: ios objective-c swift xcode safearealayoutguide

我刚刚将我的应用从支持iOS 8改为支持iOS 9及更高版本。

由于我不使用故事板来创建我的观点,我想知道是否有"使用安全区域指南" 选项以编程方式或类似的方式那。

我试图固定我的观点,但他们一直在重叠顶部和顶部。在iPhone X模拟器的底部。

2 个答案:

答案 0 :(得分:25)

在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];

参考:Use Safe Area Layout programmatically - Swift

结果:

enter image description here

答案 1 :(得分:13)

您可以通过编程方式找到顶部底部填充。我认为这将解决您的问题。

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。只需将viewDidLoad代码移动到新方法postViewDidLoad并使用:

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

...在原始viewDidLoad方法中,然后UIWindow将可访问。

OR

2.

中附上对象的创建
dispatch_async(dispatch_get_main_queue(), ^{
// your code here...
});