2017-12-18 460 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