使用安全区域将元素定位到CGRect

时间:2018-02-23 13:36:29

标签: swift ios10 ios11 safearealayoutguide

我宣布一个按钮:

let button = UIButton(frame: CGRect(x: ?, y: ?, width: 50, height: 50))

但我们请注意确保如何相对于安全区设置xy,以便它在>= iOS 11<= iOS 10上都能正常运作。

我尝试使用self.view.safeAreaInsets但由于某种原因它返回0.0。任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

制作动画时我也有同样的问题。

最终解决的问题,想法:创建一个等于safeArea框架的框架。

(仅设备方向为左和右)

CGRect safeAreaFrame;

if (@available(iOS 11.0, *)) {
    UIEdgeInsets safeAreaInsets = self.view.safeAreaInsets;
    safeAreaFrame = CGRectMake(safeAreaInsets.left,
                               safeAreaInsets.top,
                               self.view.frame.size.width - safeAreaInsets.left - safeAreaInsets.right,
                               self.view.frame.size.height - safeAreaInsets.top - safeAreaInsets.bottom);
} else {

    safeAreaFrame = self.view.frame;
}

然后使用安全区域框架,例如:

UIView *view = [[UIView alloc] initWithFrame:safeAreaFrame];
view.backgroundColor = UIColor.redColor;
[self.view addSubview:view];

注意:安全区域插图在viewDidLoad中返回(0,0,0,0), 因此它们的设置要晚于viewDidLoad, 放入viewSafeAreaInsetsDidChange或viewDidAppear中。 希望对您有帮助。

答案 1 :(得分:0)

对于iOS 11:

如果在self.view.safeAreaInsets上调用

viewDidLoad, viewWillAppear, etc将为零

如果您在viewDidLayoutSubviews, viewDidAppear上调用它,它应该具有该值