CollectiovView在导航控制器逼人退

问题描述:

我有以下的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没有帮助 –

我可能在这里错了(并且复制这个场景我自己需要一些时间),所以我会给它一个镜头。我认为无论是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