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

Ios 嵌套集合视图单元格在方向更改时不调整大小,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,外部集合视图(在ViewController文件中) 占据整个屏幕的宽度和高度 单元格还占据屏幕的整个宽度和高度 集合视图布局是水平的。能够滑动到下一个单元格 细胞的背景是绿色的 嵌套集合视图(在CollectionViewCell文件中) 占据屏幕的整个宽度和高度 单元格占据屏幕的整个宽度。身高是100, 细胞紫背景 问题 我首先在Xcode中的模拟器上以纵向方向运行应用程序 当我将方向更改为横向并滑动所有屏幕时 一个屏幕上的紫色单元格不会占据整个屏幕。这个问题只发生

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

  • 占据整个屏幕的宽度和高度

  • 单元格还占据屏幕的整个宽度和高度

  • 集合视图布局是水平的。能够滑动到下一个单元格

  • 细胞的背景是绿色的

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

  • 占据屏幕的整个宽度和高度

  • 单元格占据屏幕的整个宽度。身高是100,

  • 细胞紫背景

问题

  • 我首先在Xcode中的模拟器上以纵向方向运行应用程序

  • 当我将方向更改为横向并滑动所有屏幕时

  • 一个屏幕上的紫色单元格不会占据整个屏幕。这个问题只发生在景观中

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

    假设所有单元格在方向图上的外观

    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
            
        }
        
    }
    

  • 如果问题没有发生,请将方向更改回“纵向”,然后将其更改为“横向”。然后再次浏览所有单元格以查找问题
  • 应用程序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()
        }
        
    }
    
    集合视图单元格(具有嵌套集合视图)

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

    我在github上有这个项目

    嘿,看看这个,看看是否有用

    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")
        }
        
    }
    
     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()
        }
    }