当前位置:  开发笔记 > IOS > 正文

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

如何解决《UICollectionView-调整设备上的单元格旋转-Swift》经验,为你挑选了5个好方法。

我已经创建了一个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()
}

我假设我忘了重绘一些东西,但我不确定是什么.任何想法都非常感谢收到!



1> valvoline..:

也许最直接的方法是在viewWillTransitionToSize期间使invalidateLoutout:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
        return
    }
    flowLayout.invalidateLayout()
}


当viewcontroller是未折叠的splitviewcontroller的detailcontroller时,不会调用此方法.

2> adolfosrs..:

你可能会用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()
}


通过使用此方法,您将进入无限循环.
我不确定@valvoline是否正确,这将导致无限循环 - 但是它可能会导致性能问题,因为它使收集视图布局失效的频率远远超过必要.使用`viewWillTransitionToSize`要好得多.
此代码导致无限循环.这不应该是正确的答案.
使用此解决方案时,应用程序会无限循环
这应该没有标记为正确,并替换为`viewWillTransitionToSize`方法.

3> 小智..:

我倾向于使用viewWillTransitionToSize相同的东西,只是invalidateLayout()在那里打电话.



4> Graham Perks..:

要使集合视图调整其单元格的大小并在旋转过程中使更改生效,请使用过渡协调器:

(迅捷4+)

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    // Have the collection view re-layout its cells.
    coordinator.animate(
        alongsideTransition: { _ in self.collectionView.collectionViewLayout.invalidateLayout() },
        completion: { _ in }
    )
}



5> 小智..:

traitCollectionDidChange也可以使用方法代替viewWillLayoutSubviews

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    guard let previousTraitCollection = previousTraitCollection, traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass ||
        traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass else {
            return
    }

    if traitCollection.horizontalSizeClass == .regular && traitCollection.verticalSizeClass == .regular {
        // iPad portrait and landscape
        // do something here...
    }
    if traitCollection.horizontalSizeClass == .compact && traitCollection.verticalSizeClass == .regular {
        // iPhone portrait
        // do something here...
    }
    if traitCollection.horizontalSizeClass == .regular && traitCollection.verticalSizeClass == .compact {
        // iPhone landscape
        // do something here...
    }
    collectionView?.collectionViewLayout.invalidateLayout()
    collectionView?.reloadData()
}

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有