2017-10-21 186 views
0

我正在使用xcode 9.0.0。我有多個自定義類應用於不同的視圖。每當我在真實大小的設備上運行項目時,它都會顯示出完美的視圖,而當我在模擬器上構建它們時,佈局會從右側擠壓。這發生在任何UIView類型中。下面提供了一個示例。xcode 9模擬器佈局故障

enter image description here

在這裏,我申請一個梯度,但在右側部分被省略了。這發生在每一個觀點。我的代碼爲上面的例子是:

func addBlackGradientLayer(frame: CGRect){ 
    let gradient = CAGradientLayer() 
    gradient.frame = frame 
    gradient.colors = [UIColor.clear.cgColor, UIColor.black.cgColor] 
    gradient.locations = [0.0, 1.0] 
    self.layer.addSublayer(gradient) 
} 

我完全沒有任何線索了。任何幫助都感激不盡。

+0

您是否收到有關衝突或不足約束的警告?你有什麼限制?你在哪裏打電話給你顯示的代碼? – Paulw11

+0

你在哪裏調用這個函數?在'view'的'frame'已經完全佈置之前,你很可能會調用它。 – Paolo

+0

@ Paulw11我嘗試自動調整大小/添加缺少的約束/設置我自己的約束。另外,我沒有收到有關限制的任何警告。即使是現在,該圖像仍在自動佈局中,並且沒有任何警告/問題。 –

回答

2

我打電話這viewWillAppear中

你必須把它在viewDidAppear,就這麼簡單。

這是一個經典的「gotchya」!

PaulW11已經給出了答案,我只是把它放在這裏來幫助谷歌。


在viewWillAppear中,顯然不夠的觀點尚未出現卻會。

在viewDidAppear中,視圖實際上字面上出現了。這意味着,毫無疑問,所有事物都在屏幕上,當然也就是完全佈局。

作爲一個規則,如果你是一個業餘愛好者的iOS程序員,只是作爲一個「一般規則」 永遠只能使用viewDidAppear

這是99%案例中的「日常解決方案」。

可以說viewWillAppear和viewDidLayoutSubviews和viewDidLoad僅供專業人士使用。 「除了最微妙的不相關之外,沒有什麼不好的事情會發生,例如,性能影響,如果你只是使用viewDidAppear。所以,很簡單,總是使用viewDidAppear。

關於viewDidLayoutSubviews等之間的細微差別,這真是一個大問題,從版本略有不同,以版本和具有自動佈局等具體細節神祕;它超出了本質量保證範圍。

我幾乎可以說蘋果不應該暴露,以便突出viewDidLayoutSubviews和viewWillAppear中和viewDidLoad中的「公衆」。例如,如果您是初學者或愛好者程序員,則完全不需要使用諸如CALayer之類的東西,或者通過觸摸,構建自己的手勢,操縱過渡動畫等。

同樣,真的只是零需要使用viewDidLayoutSubviews或viewWillAppear或viewDidLoad。只需使用「viewDidAppear」(在少數情況下你需要它),你就全都設置好了。

順便提一句,如果你只是使用容器視圖,你應該隨時隨地使用容器視圖(這裏是容器視圖上的epic tutorial !!),這些UI跑道問題很少出現。

+0

'viewDidAppear' vs'viewWillAppear' vs'viewDidLayoutSubviews',它們在這種情況下究竟有什麼不同? –

+0

嗨,我回答了你的問題@AakashDave。如果(出於某種原因)你想了解這方面的細節,有大量的文章,蘋果技術講座等等 – Fattie