swift - 将 CollectionViewController 添加为子视图
问题描述
使用 Swift 5.1.3、iOS13.3、XCode11.3、
我尝试显示一个比视图宽度更宽的水平 collectionView。通过拖动,collectionView 单元格应水平滚动。
现在的问题如下:一旦我单击拖动,collectionView 内容“消失”(即变为透明)。如果你仔细看,你会发现滚动条还在。
为什么collectionView的内容一点击就变成透明的?
这是一个说明错误行为的视频:
您将在下面找到相应的代码:
这是代码:
在我的 Main-ViewController 中,我添加了 collectionView:
override func viewDidLoad() {
super.viewDidLoad()
let cardsHorizontalController = CardsHorizontalController()
self.view.addSubview(cardsHorizontalController.view)
cardsHorizontalController.view.translatesAutoresizingMaskIntoConstraints = false
cardsHorizontalController.view.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100.0).isActive = true
cardsHorizontalController.view.heightAnchor.constraint(equalToConstant: 279).isActive = true
cardsHorizontalController.view.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true
}
这是 collectionView 控制器类:
class CardsHorizontalController: BaseListController, UICollectionViewDelegateFlowLayout {
let cellId = "cellId"
override func viewDidLoad() {
super.viewDidLoad()
collectionView.backgroundColor = .clear
collectionView.register(CardHeaderCell.self, forCellWithReuseIdentifier: cellId)
if let layout = collectionViewLayout as? UICollectionViewFlowLayout {
layout.scrollDirection = .horizontal
}
collectionView.contentInset = UIEdgeInsets(top: 100, left: 0, bottom: 0, right: 0)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return .init(width: view.frame.width - 48, height: view.frame.height)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return .init(top: 0, left: 16, bottom: 0, right: 0)
}
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)
return cell
}
}
及其对应的父类:
class BaseListController: UICollectionViewController {
init() {
super.init(collectionViewLayout: UICollectionViewFlowLayout())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这里是collectionView 单元格:
class CardHeaderCell: UICollectionViewCell {
let imageView = UIImageView(cornerRadius: 8)
override init(frame: CGRect) {
super.init(frame: frame)
imageView.backgroundColor = .red
let stackView = VerticalStackView(arrangedSubviews: [
// companyLabel,
// titleLabel,
imageView
], spacing: 12)
addSubview(stackView)
stackView.fillSuperview(padding: .init(top: 16, left: 0, bottom: 0, right: 0))
}
required init?(coder aDecoder: NSCoder) {
fatalError()
}
}
解决方案
我终于找到了解决方案:
collectionView-Controller(即CardsHorizontalController()
)需要添加为ChildController!
在 Main-ViewController 的内部viewDidLoad()
(在上面的第一段代码中),请替换以下行...
self.view.addSubview(cardsHorizontalController.view)
具有以下内容:
self.addChild(cardsHorizontalController)
self.view.addSubview(cardsHorizontalController.view)
self.didMove(toParent: cardsHorizontalController)
这样做后,一切都按预期工作!
您可以在此 GitHub 存储库中找到一个工作项目(仅包含 CollectionView):https ://github.com/iKK001/HorizontalCollectionViewExample
因为我很高兴 - 这里有一个工作水平 CollectionView 的视频:
推荐阅读
- arrays - firebase 使用数组将数据添加到数据库
- c# - 在结构性能影响中包装 C# 原语
- python - 这些 Big-O 符号对于简单的模数和幂函数 (Python) 是否正确?
- swiftui - SwiftUI 使文本部分可点击
- python - 如何限制自定义验证器仅将错误推送到 field.errors 而不是 django 消息?
- c# - ef form app c# code first with sqlite error db.SaveChanges no such a table
- java - java没有得到输出piglatin
- direct3d - MFVideoFormat_H264可以直接支持MFVideoFormat_RGB32的输入媒体类型吗?
- scala - Akka HTTP 路由 DSL 示例无效
- spring-boot - RabbitMQ Spring cloud stream 仅在数据库事务提交时发布消息