ios - 当设备从纵向模式进入横向模式时,水平集合视图单元格内的垂直集合视图单元格不会调整大小
问题描述
我一直在尝试在水平集合视图中实现垂直集合视图。我的冒险在很大程度上取得了成功。但是当设备从纵向模式旋转到横向模式时,垂直集合视图单元格不会调整大小。尽管当设备从横向模式进入纵向模式时,单元格会正确调整大小。由于我已经使 viewWillTransitionToSize 函数内的流布局无效,因此即使是水平集合视图单元格也会正确调整大小。我也为垂直集合视图(在单独的 CocoaTouch 文件中的“HorizontalCollectionViewCell”类中)实现了相同的函数(使用其他函数,如 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()
}
}
这是子类 HorizontalCollectionViewCell 文件中的代码:-
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()
}
}
解决方案
推荐阅读
- python - 在 Python 中制作一个旋转球体
- php - 如果 Memcache 实例达到其内存限制,存储在 Memcached 中的 PHP 会话会发生什么情况?
- racket - 使用语法解析时评估条件?
- infinite-loop - Hyperledger Sawtooth 如何处理无限/无限循环?
- apache-spark - Spark SQL 为字符串列的最大值返回 null
- graph - 从/到集团问题的减少以证明问题是 NP 完全的
- python - 不知道如何在 python 3 中把它变成一个循环
- azure - 使用资源令牌的 CosmosDb Rest SQL 查询
- java - 用不同的方法用 BigDecimal 数计算 pow(int n)
- c - AF_TCNMESSAGE(从 getaddrinfo() 作为 ai_family 字段的值返回)是什么意思?