在使用iOS的Size Classes發現了一個坑。
我們先來做個很簡單的Demo,storyboard圖如下:
屏幕快照 2015-04-19 下午8.55.34.png
我們在
ViewController
視圖里放一個button,點擊后push到OtherViewController
里,OtherViewController
里有一個tableView, tableView有一個動態cell,cell的頂部有一個紅色的UIView。這里我們都用autolayout來做布局。我們運行一下,效果圖如下:
iOS Simulator Screen Shot 2015年4月19日 下午9.02.34.png
我們看到運行很正常。
那假如我們一開始創建的時候就用Size Classes的wCompact-hRegular
類型而非默認的wAny-hAny
。
屏幕快照 2015-04-19 下午9.06.06.png
大家覺得運行效果會跟上面的一樣嗎?之前我一直認為是一樣的,可事實卻不是這樣的。我們來看下運行效果。
iOS Simulator Screen Shot 2015年4月19日 下午9.06.37.png
我們可以看到第一個cell的紅色視圖被導航欄遮擋住了。
我之所以發現這個問題,是我在工作的時候,要做一個動態cell,里面有的視圖有時候有,有時候沒有。我以前一直的做法是將要隱藏的視圖的高度約束改為0,然后用
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize
來自動計算cell的高度。可這次卻發現這個方法不會計算高度了,每個cell的高度都返回44。又試了好幾次還是不行。
決定把計算高度改為手動計算,不過又發現一個小bug,決定將一些有時候有,有時候沒有的視圖改為用
Masonry
來手動寫約束。這時候又出現問題了,程序一運行到代碼寫的約束就會崩潰,說找不到兩個視圖的父視圖。然后,我寫了一個簡單的Demo發現這樣寫是沒有問題的,不知道為什么在我的工程里就會出現問題。浪費了好多時間,為了再次確認,我又重寫那個簡單的Demo發現這個也會崩潰了,我就百思不得其解,同樣的代碼,同樣的約束,為什么這個就運行不起來呢?
我開始挨個對比這兩個Demo,無意間發現我兩次Demo的Size Classes的類型不同,我把崩潰的那個Demo也改為wAny-hAny,神奇的事情發生了,以前的問題都消失了。
我現在還不清楚為什么會這樣,按理說這兩種類型應該都沒有問題的。不過事實就是這樣,我以后工程里都會用默認的wAny-hAny類型了,暫時不再用其他類型。因為這個問題已經耽誤了我好幾天時間了,我的時間呀,啊啊啊啊啊啊……
如果有人知道原因可以在下面評論下,告訴我。不勝感激。