一尘不染

UICollectionView-调整设备上单元格的大小旋转-Swift

swift

我创建了一个UICollectionView,以便可以将视图排列成整齐的列。我希望在宽度大于500像素的设备上有一列。

为了实现这一点,我创建了以下功能:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let size = collectionView.frame.width
    if (size > 500) {
        return CGSize(width: (size/2) - 8, height: (size/2) - 8)
    }
    return CGSize(width: size, height: size)
}

这在第一次加载时可以按预期工作,但是当我旋转设备时,计算并不总是再次发生,并且视图也不一定总是按预期重绘。这是设备旋转时的代码:

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    collectionView.collectionViewLayout.invalidateLayout()
    self.view.setNeedsDisplay()
}

我假设我忘记重画了一些东西,但是我不确定是什么。非常感谢任何想法!


阅读 296

收藏
2020-07-07

共1个答案

一尘不染

您可以使用viewWillLayoutSubviews。这个问题应该会有所帮助,但是只要视图控制器视图将要布局其子视图,就可以大声地称呼它。

因此您的代码将如下所示:

override func viewWillLayoutSubviews() {
  super.viewWillLayoutSubviews()

  guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
    return
  }

  if UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation) {
    //here you can do the logic for the cell size if phone is in landscape
  } else {
    //logic if not landscape 
  }

  flowLayout.invalidateLayout()
}
2020-07-07