2014-09-23 48 views
24

我正在爲iPhone和iPad開發應用程序。它支持iOS6和iOS7,並且僅使用自動佈局。iOS7自動撥號問題,在iOS7上正常工作的代碼

在過去的一週,當蘋果宣佈iOS8已準備好黃金時段時,我將其中一款iPhone和iPad升級到了iOS8。我還將我的XCODE撞到了版本6.我有第二個iPhone,我在iOS7上離開了。

我使用Xcode 6生成了新的可執行文件,當我在運行iOS8的設備上執行它們時,看到它們的屏幕布局搞砸了,但在iOS7上仍然很好。在我的物理設備和Xcode的仿真器上都是如此。

它花了很多的挖掘,但我很清楚現在發生了什麼,雖然我不知道爲什麼。

具體來說,某些自動佈局操作在iOS8上失敗,但它們在iOS7上很好。

涉及一個按鈕,用於我上,其大小等於該屏幕的尺寸的基礎視圖放置一些例子:

(1)如果我要求自動佈局來定位按鈕的水平中心(CX)等於到底層視圖的水平中心,結果是按鈕的水平中心被放置在底層視圖的左邊緣上。 (2)如果我要求自動佈局來使按鈕的寬度等於底層視圖寬度的50%,那麼它根本沒有寬度。

我能夠解決這些問題如下:

(1)請問自動佈局來定位按鈕的中心等於基礎視圖的左邊緣加上屏幕寬度的50%。 (2)我問自動佈局,使按鈕的寬度等於屏幕寬度的50%。

我正慢慢地將自己的方式與這樣的解決方法一起回溯到適用於iOS7和iOS8的自動佈局代碼。但我真的很想知道這裏發生了什麼。

它看起來像自動佈局不能確定底層視圖的大小,因此自動佈局計算,要求信息失敗。但它確實知道視圖的頂部和左邊的位置是如何根據這些數據進行計算的。

這是一個大型應用程序,我已經爲iOS6和iOS7編寫了數百行自動佈局代碼,這些代碼非常適合我。

我一直在調整和嘗試與iOS8三天的事情,我不聰明,當我開始時。

任何人有什麼建議或想法,可能是什麼問題在這裏?

+0

我在同一條船上。無論如何,它看起來像你的基礎視圖的寬度是0開始寬度,因此,當你告訴你的按鈕的中心X是基礎視圖的中心X時,該按鈕出現在左邊緣。 – Zhang 2014-09-23 10:40:13

+1

是的,從我目前看到的情況來看,一旦我開始在視圖上放置控件,我可以使用這些控件之間自動佈局關係的所有不同變體。也就是說,一個按鈕的水平中心可以與另一個按鈕對齊,沒有問題。 – Gallymon 2014-09-23 17:02:56

+0

我應該提及,我不使用IB。我的所有自動佈局代碼都是通過直接構建NSLayoutConstraint/s完成的。總是這樣做,它在iOS7中完美運行。 – Gallymon 2014-09-23 17:09:50

回答

3

您可能會發現這個問題的答案有幫助:UICollectionView cell subviews do not resize

在大多數情況下iOS7而不是在iOS上8汽車佈局問題的作品似乎從根視圖中的iOS 8不是大小正確地幹,尤其是當我們將translatesAutoresizingMaskIntoConstraints設置爲NO時。對於我的觀點,我能夠在layoutSubviews中設置根視圖的框架(或者具有正確界限的適當的初始化器),並解決了這個問題。

self.contentView.frame = CGRectInset(self.bounds, 0, 0); 

如上所示的答案,你也可以做

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 

,然後打開translatesAutoresizingMaskIntoConstraints回NO開始在代碼中設置自己的約束了。

絕對討厭我們這麼多時間都是用這些令人討厭的陷阱去做的。

+0

Praneeth,謝謝你。我試過了,但它不影響我遇到的問題。 – Gallymon 2014-09-23 23:01:51

+0

嗯,很抱歉聽到沒有幫助。在我的情況下,我有IB約束的混合,然後在運行時調整代碼,這解決了我的問題。祝你好運。 – 2014-09-25 04:38:08

11

@robmayoff有一個很好的答案:https://stackoverflow.com/a/26066992/1424669

從本質上講,在iOS8上可以不再調用一個視圖setNeedsUpdateConstraintssetNeedsLayout,並期望子視圖的限制更新。

您必須在約束髮生變化的視圖上調用這些方法。這與iOS7向後兼容。

例:

假設你有一個視圖控制器與根視圖self.view和一個叫containerView子視圖。 containerView有一個NSLayoutConstraint附加到它,你想改變(在這種情況下,頂部空間)。

在iOS7你可以通過請求新的佈局根視圖更新一個VC的所有約束:

self.containerView_TopSpace.constant = 0; 
[self.view setNeedsUpdateConstraints]; 
[self.view setNeedsLayout]; 

在iOS8上,你需要請求對containerView佈局:

self.containerView_TopSpace.constant = 0; 
[self.containerView setNeedsUpdateConstraints]; 
[self.containerView setNeedsLayout]; 
+0

BFar,這是個好消息,並且很有意義。我迫不及待地想嘗試一下,看看我能否把這個問題拋諸腦後。 – Gallymon 2014-09-27 04:46:16

+0

@BFar您可以將一個簡單的示例項目(例如適用於7 SDK,但不適用於8 SDK)放在一起,然後提交雷達並共享雷達#? – smileyborg 2014-09-30 16:23:44

+0

BFar,我嘗試了robmayoff的想法,但他們似乎與我的問題沒有關係。我現在有一個法律解決方法,所以我很緊張。謝謝! – Gallymon 2014-10-03 01:52:48

0

在我的情況,與標記爲UIView-Encapsulated-Layout-WidthUIView-Encapsulated-Layout-Height的約束有關的問題。當我刪除它們時,所有事情都表現得好像我的視圖的大小爲零,所有內容都集中在屏幕的左上角。當我離開他們時,新的限制按預期工作。我還保留了標有_UILayoutSupportConstraint的限制條件。