首页 > 解决方案 > 当设备从纵向模式进入横向模式时,水平集合视图单元格内的垂直集合视图单元格不会调整大小

问题描述

我一直在尝试在水平集合视图中实现垂直集合视图。我的冒险在很大程度上取得了成功。但是当设备从纵向模式旋转到横向模式时,垂直集合视图单元格不会调整大小。尽管当设备从横向模式进入纵向模式时,单元格会正确调整大小。由于我已经使 viewWillTransitionToSize 函数内的流布局无效,因此即使是水平集合视图单元格也会正确调整大小。我也为垂直集合视图(在单独的 CocoaTouch 文件中的“Horizo​​ntalCollectionViewCell”类中)实现了相同的函数(使用其他函数,如 numberOfItemsAtIndexPath、cellForItemAt、sizeForItemAt 等)。但一切顺理成章。所有视图和子视图(包括两个集合视图)都是使用故事板(不是代码)创建的。过去 1 周我一直在寻找解决方案,但还没有成功。请帮助我找到解决此问题的适当方法。

这是 ViewController 文件中的代码:-

import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var horizontalView: UIView! // Container View for horizontal Collection View.

@IBOutlet weak var horizontalCollectionView: UICollectionView!


override func viewDidLoad() {
    super.viewDidLoad()
    horizontalCollectionView.delegate = self
    horizontalCollectionView.dataSource = self
    menuBarCollectionView.delegate = self
    menuBarCollectionView.dataSource = self
}

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if collectionView == menuBarCollectionView {
        let cell = menuBarCollectionView.dequeueReusableCell(withReuseIdentifier: "menuButtonsCell", for: indexPath) as! MenuBarCollectionViewCell

        cell.menuButtonsLabel.text = menuButtonsName[indexPath.row]
        return cell
    }

    let cell = horizontalCollectionView.dequeueReusableCell(withReuseIdentifier: "horizontalCell", for: indexPath) as! HorizontalCollectionViewCell
    return cell
}


func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
    if collectionView == menuBarCollectionView {
        let menuButtonWidthFactor = self.menuBarView.frame.width - 1
        return CGSize(width: menuButtonWidthFactor / 3, height: 35)
    }
    return CGSize(width: horizontalView.frame.width, height: horizontalView.frame.height)

}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    if collectionView == menuBarCollectionView {
        return 0.5
    }

    return 0
}

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

这是子类 Horizo​​ntalCollectionViewCell 文件中的代码:-

import UIKit

class HorizontalCollectionViewCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var verticalCollectionView: UICollectionView! {
   didSet {
        self.verticalCollectionView.delegate = self
        self.verticalCollectionView.dataSource = self
    }
}


@IBOutlet weak var verticalView: UIView!

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = verticalCollectionView.dequeueReusableCell(withReuseIdentifier: "verticalCell", for: indexPath)
    cell.backgroundColor = UIColor.red
    return cell
}

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

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

标签: ios

解决方案


推荐阅读