2016-09-26 64 views
6

你可以下載一個示例項目演示下面這裏的問題會自動試圖大小時失去高度而是將它們錨定到視圖/輸入視圖,以便理論上系統將根據環境和方向確定它們的高度,在某些情況下,高度變爲0並且鍵盤被壓碎(除了具有混凝土高度的任何物體如自我尺寸的標籤或按鈕)。鍵盤的延長iOS中10在某些情況下

這似乎只發生在iOS 10上。在iOS 9上,子視圖正確調整大小以適應默認的自動鍵盤高度。

有幾種情況可以顯示,這個項目演示了一個基本的場景。它開始用默認的「下一個鍵盤」按鈕,基本的鍵盤擴展模板,並配備了2點大小的限制:

self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 

接下來,我們創造,我們要填補上海華盈的空間,其他單一視圖沒有確定具體的大小本身:

let anotherView = UIView() 
anotherView.backgroundColor = UIColor.red 
anotherView.translatesAutoresizingMaskIntoConstraints = false 
view.addSubview(anotherView) 
anotherView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
anotherView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true 
anotherView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 

現在,讓我們說,我們只是要錨定到我們的鍵盤上海華底部這一新觀點。我們只是做這樣的事情:

anotherView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 

結果看起來是這樣的:

的iOS 9 enter image description here

iOS的10 enter image description here

這種佈局正是我們期望的。現在,讓我們將新視圖定位到下一個鍵盤按鈕的頂部。我們擺脫我們剛纔添加的約束,並與

anotherView.bottomAnchor.constraint(equalTo: self.nextKeyboardButton.topAnchor).isActive = true 

邏輯上取代它,得到的高度應該是相同的(由系統決定)

結果現在是這樣的:

的iOS 9 enter image description here

的iOS 10 enter image description here

在iOS 9上,它的行爲與預期相同,但在iOS 10中,靈活高度視圖的大小調整爲0,剩下的全部爲固定高度按鈕。

沒有關於衝突約束的消息。我試圖找出可能導致這種情況的原因以及爲什麼它只會在iOS 10上發生。

回答

3

蘋果迴應了我的DTS票,並告訴我如何提交錯誤報告,所以這實際上是一個iOS的10錯誤。我已經提交了一個雷達(#28532959),並會更新這個答案,如果我得到答覆。如果有人提出了一個具體的解決方案,使我仍然可以使用自動佈局來實現自動高度,答案仍然可以接受。

+0

你有沒有得到任何東西回答?我們面臨同樣的問題,如果您有任何問題,我很樂意爲您提供更新。 –

+0

沒有。只是一個錯誤,你必須找到一種方法來制定你的約束而不觸發它。對我來說只是試錯。 – Dima

+0

@Dima你對這個問題有任何答案嗎? – Ramakrishna

0

我也遇到了同樣的問題。這是因爲Autolayout Constraints。只要刪除所有約束。並設置自動調整大小。 enter image description here

+0

不幸的是,這不是我的選擇。 – Dima

0

我解決了它的高度設置一個新的約束。

enter image description here

+1

不幸的是,它看起來像你的解決方案是硬編碼一個不變的高度。這正是我想要避免的,因爲我支持每個設備的大小和方向,所以我想讓系統決定適當的高度來使用它應該工作,但停止在iOS 10中工作。 – Dima

1

這是我的解決方法。當設備旋轉時它有點遲緩,但它會完成這項工作,直到Apple修復此錯誤。我首先想到它與inputView.allowSelfSizing有關,但該變量似乎沒有改變任何東西。

首先,聲明heightConstraint

var heightConstraint: NSLayoutConstraint! 

viewDidLoad,添加自定義視圖:

let nibName: String! = UIDevice.isPhone ? "KeyboardViewiPhone" : "KeyboardViewiPad" 
customView = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?.first as! UIView 
customView.translatesAutoresizingMaskIntoConstraints = false 
view.addSubview(customView) 

添加約束的寬度,你通常會做的事:

let widthConstraint = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: customView, attribute: .width, multiplier: 1.0, constant: 0.0) 

爲高度添加一個常量約束:

heightConstraint = NSLayoutConstraint(item: customView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: view.frame.height) 
view.addConstraints([widthConstraint, heightConstraint]) 

現在來修復:

override func viewDidLayoutSubviews() { 
    heightConstraint.constant = view.bounds.height 
} 

由於viewDidLayoutSubviews被稱爲每次view.bounds的變化,它會處理正確的方向變化。

0

我也遇到了Xcode 8.2中自定義鍵盤擴展的相同問題。這是由auto resizing引起的。就我而言,我以下面的方式解決了這個問題。

最初,我的自定義鍵盤有3個視圖。 在這裏,我修正了第一個和最後一個視圖的拖尾,前導,頂部和高度。並將中間視圖放置在圖像中。 enter image description here

之後選擇中間視圖並在故事板中打開show the size inspector。在size inspector,你會發現一個選項auto resizing。在那裏選擇該視圖的約束指標。

enter image description here

選擇您在設備運行項目,它會正常工作,而不會錯過任何視圖後。

注意: - 它適用於縱向和橫向模式。主要是你不必爲中間視圖給出約束。

+0

@Dima檢查我的答案。我也像你一樣結束了。但是這個過程解決了我的問題。希望它能爲你工作。 – Ramakrishna

0

恕我直言,最好的工作解決方案是使用「比例高度」。例如,就我而言,我最終以2個視圖結束。排名第一的是超級高度的0.8,最低的是0.2。這不是完美的解決方案,但您仍然可以從自動佈局中受益。

Proportional

相關問題