[英]UISplitViewController Resizing App Content when Keyboard Appears on iPhone
我有嵌套在SplitViewController
視圖,而SplitViewController.preferedDisplayMode
是.primaryOverlay
。
當用戶在水平緊湊的設備上調出鍵盤時,我的應用程序的整個內容視圖調整為僅包括鍵盤上方的區域和任何輸入附件視圖。
這與出現在內容上的鍵盤的預期行為相反(內容插入應用於滾動視圖,因此用戶可以看到重要的內容)。
通過旋轉設備,這種調整大小的行為就會消失。 事實上,在單次旋轉之后,在重新啟動應用程序之前,行為將不會再次發生(即使您旋轉回原始旋轉)。
這些照片是在iPhone上拍攝的,拆分視圖為了清晰起見而折疊。
這是鍵盤出現后調整大小的內容的調試快照(調整大小的后面的后視圖是我沒有創建的UIPopoverView
)。 請注意,鍵盤不在此快照中,因為iOS將鍵盤放在RemoteKeyboardWindow
。
這是一個調試快照,並在旋轉到橫向然后回到縱向和鍵盤后查看內容的調試快照(問題已經消失):
任何文本輸入視圖都會出現此問題。
這對我來說是一個奇怪的問題,所以如果有人以前見過它或知道要采取的任何步驟,我將不勝感激。
我通過這篇關於UISplitViewController中現有錯誤的精彩博文發現了這個問題的原因。
當水平緊湊的環境請求.primaryOverlay
樣式時,會出現錯誤。 該樣式將覆蓋物包裹在彈出窗口中,並且所有彈出窗口都會自動調整大小以避開鍵盤。 因為水平緊湊的設備只顯示一個視圖,所以這會在調整大小的彈出框中包含所有應用程序內容。
原來, UISplitViewController
具有一個未記錄的行為,其中旋轉裝置使重新評估preferedDisplayMode
屬性。 在水平的緊湊型設備的情況下,重新評估將設置屬性回.automatic
(或.primaryHidden
),這會停止在包裹一個調整酥料餅的內容,固定的問題。
解決方案是在初始化和特征變化時根據設備特征手動設置preferedDisplayMode
屬性。
通過按如下方式對UISplitViewController
進行子類UISplitViewController
,我能夠解決問題,同時保持iPad上的當前行為:
// Swift 3
class AdaptiveSplitViewController : UISplitViewController {
override func viewDidLoad() {
super.viewDidLoad()
evaulateOverlayType(for: self.traitCollection)
}
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
evaulateOverlayType(for: newCollection)
}
private func evaulateOverlayType(for traits: UITraitCollection) {
if traits.horizontalSizeClass == .regular {
self.preferredDisplayMode = .primaryOverlay
} else {
self.preferredDisplayMode = .automatic
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.