2016-02-27 30 views
0

我有以下的CollectionView佈局(紅色)前後發生了改變佈局CollectiovView在導航控制器逼人退

enter image description here

如果我按到下一個控制器,然後按返回鍵,它看起來像這樣

enter image description here

如何避免這種情況發生呢?我的代碼如下

override func viewDidLoad() { 
    super.viewDidLoad() 

    screenSize = UIScreen.mainScreen().bounds 
    screenWidth = screenSize.width 
    screenHeight = screenSize.height 

    collectionView.backgroundColor = UIColor.whiteColor() 
    tableViewHeightConstant.constant = 5*44 
    collectionViewHeightConstant.constant = screenSize.width/2 * 2 // for testing purposes 

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
    layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0) 
    layout.itemSize = CGSize(width: screenWidth/2, height: screenWidth/2) 
    layout.minimumInteritemSpacing = 0 
    layout.minimumLineSpacing = 5 
    collectionView.setCollectionViewLayout(layout, animated: true) 
} 
+0

你執行在'viewDidLoad'佈局的大小和位置的計算。視圖加載完成後不調用'viewDidLoad'。您是否曾嘗試在'viewWillAppear'中運行該代碼。 – Gordonium

+0

放置它的更好的地方是'viewDidLayoutSubviews',每當superview' self.view'改變邊界時調用'viewDidLayoutSubviews'。 – mattsven

+0

既不viewWillAppear,也不viewDidLayoutSubviews沒有幫助 –

回答

0

我可能在這裏錯了(並且複製這個場景我自己需要一些時間),所以我會給它一個鏡頭。我認爲無論是lineSpacingsectionInset佈局過程中考慮到......你能試着從itemSize減去minimumLineSpacing

嘗試是這樣的:

layout.itemSize = CGSize(width: ((screenWidth - layout.minimumLineSpacing)/2), height: screenWidth/2) 

而且,顯然設置minimumLineSpacing你這樣做計算之前,否則你會用不同的值工作。

正如mattsven在評論中指出的那樣,我也認爲你應該在viewDidLayoutSubviews中這樣做。

還有一點:我勸你不要使用屏幕的尺寸,但潛在的視圖控制器的視圖的維度。 因此,這些都是你要使用的尺寸:

取而代之的是:

屏幕尺寸= UIScreen.mainScreen()範圍

屏幕寬度= screenSize.width

screenHeight = screenSize.height

我會用這個:

viewSize = self.view.frame.size 
viewWidth = viewSize.width 
viewHeight = viewSize.height