嵌套集合视图单元格未在方向更改时调整大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌套集合视图单元格未在方向更改时调整大小相关的知识,希望对你有一定的参考价值。

外集合视图(在ViewController文件中)

  • 占据屏幕的整个宽度和高度
  • Cell还占据了屏幕的整个宽度和高度
  • 集合视图布局是水平的。能够滑动到下一个单元格。
  • 细胞背景是绿色的

嵌套集合视图(在UICollectionViewCell的文件中)

  • 占据屏幕的整个宽度和高度
  • Cell占据屏幕的整个宽度。身高是100,
  • 细胞紫色背景。

问题

  1. 我首先在Xcode的模拟器上以纵向方式运行应用程序。
  2. 当我将方向更改为横向并滑动所有屏幕时,
  3. 一个屏幕将有紫色单元格,不占用整个屏幕。此问题仅发生在横向中。

问题:总是有一个像这样的紫色单元格的屏幕

所有细胞如何看待定向景观

  1. 如果没有出现问题,请将方向更改回纵向,然后将其更改为横向。然后再次扫描所有单元格以找到问题。

App Delagate

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow()
        window?.makeKeyAndVisible()

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal

        window?.rootViewController = ViewController(collectionViewLayout: layout)

        return true

    }

}

查看控制器

import UIKit

class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView?.register(CollectionViewCell.self, forCellWithReuseIdentifier: "cellid")
        collectionView?.isPagingEnabled = true
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 3
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellid", for: indexPath) as! CollectionViewCell
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width, height: view.frame.height)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        collectionViewLayout.invalidateLayout()
    }

}

集合视图单元格(具有嵌套集合视图)

import UIKit

class CollectionViewCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.backgroundColor = .green
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.delegate = self
        collectionView.dataSource = self
        return collectionView
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

        backgroundColor = .purple

        addSubview(collectionView)

        collectionView.topAnchor.constraint(equalTo: topAnchor).isActive = true
        collectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        collectionView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        collectionView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true

        collectionView.register(InnerCell.self, forCellWithReuseIdentifier: "cellid")
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 2
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellid", for: indexPath) as! InnerCell
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: frame.width, height: 100)
    }

}

内部单元格(嵌套集合视图的单元格)

import UIKit

class InnerCell: UICollectionViewCell {

    override init(frame: CGRect) {
        super.init(frame: frame)

        backgroundColor = .purple
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

我在github https://github.com/vk99x/Nested-Collection-View上有这个项目

答案
 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    collectionViewLayout.invalidateLayout()
    // Also try reloading your collection view to calculate the new constraints
    DispatchQueue.main.async{
        collectionView.reloadData()
    }
}

嘿检查这个,让我们看看它是否有帮助

以上是关于嵌套集合视图单元格未在方向更改时调整大小的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建的 UILabel 未在旋转时调整大小

Twitter Bootstrap:导航栏未在方向更改时调整大小(仅适用于 Android 的股票浏览器)

在旋转时调整 UICollectionViewCells 的大小会更改当前可见的单元格 [重复]

单元格未在表格视图中正确显示

CollectionView 单元格未在视图控制器中加载

React Native Image 不会在设备(iOS)方向更改时调整大小?