2017-12-18 462 views
0

我有一个应用需要在iOS9-11以及X以外的iPhone上运行。我已经使用XCode 9构建了它,以便获得完整的iPhone X屏幕,但我似乎无法让它与缺口正确显示。我的应用程序使用自定义用户界面视图,在视图范围内绘制自己(全屏视图)。它目前正位于缺口之下。我想要做的是,它的行为与iOS9 +中的iPhone 5+一样,但在X上画一个全屏背景,但只能使用远离切口的区域与用户进行交互。这包括纵向时的顶部和手机横向时的侧面。我基本上想扩展我的插图,以允许在缺口下留有余量,所以用户按钮不会像当前那样被遮挡。我试过safeLayoutBounds,但似乎只能通过iOS11 API访问。iOS应用尊重iPhone X屏幕约束,而不使用iOS 11 API

要重申,我想使用空间作为后台使用,但scoot控件等离开缺口。所以我想知道: 1 - 屏幕尺寸(我已经有), 2 - 缺口在那里 - 我假设我只能通过手机型号和方向来分辨, 3 - 界限是什么缺口覆盖,所以我可以避免它。

这里有两个屏幕截图来说明,如果不清楚的话。很抱歉的大小,我试图调整他们更小:

景观缺口覆盖按钮 Landscape notch covers buttons 肖像覆盖到显示器 Portrait it covers the display

+0

使用应该使用安全区域布局指南进行自动布局。 – MBN

+0

检查此https://stackoverflow.com/questions/46344381/ios-11-layout-guidance-about-safe-area-for-iphone-x – karthikeyan

+0

你有故事板或代码中的布局? – GoodSp33d

回答

1

好吧,首先 - 也许最重要的是,为什么要任何 iPhone X除了iOS 11还在运行吗? (提示:需要降级)

话虽如此,诀窍是(a)检查正在运行的iOS版本,然后(b)了解在iOS 11中引入了哪些其他--即安全区域。

因为我需要知道这个安全区的更确切尺寸我增加了一个无形的,最低级的视图。我想你可以把我的代码,看看如何将它应用到你的需求:

let safeAreaView = UIView() 
.... 
safeAreaView.backgroundColor = UIColor.clear 
safeAreaView.translatesAutoresizingMaskIntoConstraints = false 
view.addSubview(safeAreaView) 
.... 
view.sendSubview(toBack: safeAreaView) 

而且布局:

let margins = view.layoutMarginsGuide 
view.addLayoutGuide(margins) 

if #available(iOS 11, *) { 
    let guide = view.safeAreaLayoutGuide 
    safeAreaView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0).isActive = true 
    safeAreaView.bottomAnchor.constraintEqualToSystemSpacingBelow(guide.bottomAnchor, multiplier: 1.0).isActive = true 
} else { 
    safeAreaView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true 
    safeAreaView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true 
} 
safeAreaView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
safeAreaView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 

最终结果?你有一个观点,你可以基于剩余的布局。是的,它在“安全”区域提供不是的点。更改backgroundColor以了解我的意思。

我确定有更好的方法可以确定(a)这个safeView的实际高度或(b)说明一些事情。但这应该适用于iOS 11,iOS 10,iPhone X,iPhone SE。

更多的,它适用于AutoLayout。

+0

我的问题可能并不清楚,但我并不试图支持运行iOS 11的iPhone X,我希望我的应用能够在所有iPhone上运行,并且能够在iPhone X上正确运行。我不想使用iOS 11编程API因为我不想限制兼容性。 – absmiths

+0

我之前没有使用#available功能 - 我认为它允许您的代码在两者上编译和运行。我会尝试一下。 – absmiths

+0

是的,这就是'if @ available'所做的。为了快速了解安全区域,将颜色从'UIColor.clear'更改为其他颜色(我喜欢橙色!),并将上述代码放在一个空白的项目中。它表现出它自己的挑战,取决于你的布局。 – dfd