【问题标题】:UICollectionViewCell size to fit for all cells on device rotationUICollectionViewCell 大小以适应设备旋转上的所有单元格
【发布时间】:2019-07-30 05:11:17
【问题描述】:

我有一个寻呼机全屏collectionview。当设备旋转时,collectionview 的第一个单元格适合在横向和纵向模式下的 collectionview。但是当我在collectionview上滚动下一个单元格时,它显示了两个单元格。而且它不适合所有屏幕。尽管我滚动collectionview并旋转,如何使所有单元格大小适合collectionview。我尝试了 invalideLayout() 和很多方法。但我达不到。只是我想要的,collectionviewcell 在任何情况下都适合整个屏幕,尽管滚动和旋转。

P.S collectionviewcell size 应该是整个屏幕大小。

public override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.height
        layout.itemSize = CGSize(width: width, height: UIScreen.main.bounds.width)
        layout.invalidateLayout()
    } else if UIDevice.current.orientation.isPortrait,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.width
        layout.itemSize = CGSize(width: width , height:  UIScreen.main.bounds.height)
        layout.invalidateLayout()
    }
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let width = view.frame.size.width
    return CGSize(width: width , height: UIScreen.main.bounds.height)
}

【问题讨论】:

  • 你在sizeForItemAtIndexPath写了什么?
  • 可以分享截图吗?
  • 我添加了我的问题@iPeter
  • 好的。检查。
  • 你想要什么滚动方向?水平的还是垂直的?

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout


【解决方案1】:

确保删除单元格之间的间距,如下所示。这将解决您的问题。

【讨论】:

  • 是的,它们是 0。你能检查我最新的代码块吗?
  • 删除willTransition方法。
  • sizeForItemAtIndexPath里面,写return CGSize(width: view.frame.size.width, height: view.frame.size.height)
  • 不需要其他任何东西。
  • 我删除并更新了。但它仍然无法正常工作,兄弟。当我滚动到下一个单元格并旋转设备时,collectionview 再次显示两个单元格。抱歉,兄弟无法向我展示我的代码,这是保密的
【解决方案2】:

您必须在 viewWillLayoutSubviews() 中编写代码。像这样

覆盖 func viewWillLayoutSubviews() { super.viewWillLayoutSubviews()

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



    if UIDevice.current.orientation == .landscapeLeft
    {
        flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 500)
    }
    else if UIDevice.current.orientation == .landscapeRight
    {
        flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 500)
    }

    flowLayout.invalidateLayout()
}

【讨论】:

  • 删除公共覆盖 func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) 和 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 方法并且只设置如上所述,您在 viewWillLayoutSubViews 中的尺寸
  • 太糟糕了
  • 可以放截图吗?所以最好了解它是如何工作的
  • 好的。在 storybord->Collectionview->SizeInspector 的 Min Spacing 中都设置为 0
  • 我认为您错过了将 Collectionview 和单元格内容的 X 位置设置为 0 并将 imageview 的图像内容模式设置为缩放填充或纵横填充
【解决方案3】:

您可以尝试应用以下方法吗?

第一次接近

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

   super.viewWillTransition(to: size, with: coordinator)

   // YOUR CODE OR FUNCTIONS CALL HERE

}

第二次接近

override func viewDidLoad() {
    super.viewDidLoad()        

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
}

deinit {
     NotificationCenter.default.removeObserver(self)
}

func rotated() {
    if UIDevice.current.orientation.isLandscape,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.height
        layout.itemSize = CGSize(width: width, height: UIScreen.main.bounds.width)
        layout.invalidateLayout()
    } else if UIDevice.current.orientation.isPortrait,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.width
        layout.itemSize = CGSize(width: width , height:  UIScreen.main.bounds.height)
        layout.invalidateLayout()
    }
}

【讨论】:

  • 正如我之前所说,此代码适用于第一个 collectionview 单元格。当我滑动到第二个单元格时,collectionview 显示两个单元格。那是我的问题
  • 你能把单元格的图片放上去吗
  • 您能否在滑动第一个单元格后验证 CollectionView sizeForItemAt 方法调用并在该方法中打印 View 的大小。
  • func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { print("collectionViewLayout: width (view.frame.width), height: (view.frame .height)") return CGSize(width: view.frame.width, height: view.frame.height) } 现在我正在使用 iphone 8。当我处于纵向模式时,它打印出宽度 375.0,高度:667.0,当我在横向模式宽度 667.0,高度:375.0
猜你喜欢
  • 2017-03-19
  • 2016-03-12
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多