我必须用SwiftUI List
替换现有的UICollectionView
视图(因为应用程序设计已更新,而新的设计对于SwiftUI来说相当复杂,因此必须将其实现为自定义{ {1}})
所以视图(现在将成为UICollectionViewCell(或一部分))已经在SwiftUI中实现了,我不想在Swift中重写它们。在写下布局代码方面,视图很复杂,显然使用SwiftUI很容易。
我可以找到一些帮助包装this one之类的集合视图的方法,但是关于如何在UICollectionViewCell中托管现有的ui ui视图的知识很少
任何帮助/建议/链接将不胜感激。
谢谢
答案 0 :(得分:1)
我确实做到了。但是不确定这是否是正确的解决方案。如果有人有更好的解决方案,请添加您的答案。
因此,我创建了一个UICollectionViewCell
子类。
final class HostingCollectionViewCell: UICollectionViewCell {
func host<Content: View>(_ hostingController: UIHostingController<Content>) {
backgroundColor = .clear
hostingController.view.translatesAutoresizingMaskIntoConstraints = false
hostingController.view.backgroundColor = .clear
addSubview(hostingController.view)
let constraints = [
hostingController.view.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0),
hostingController.view.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 0),
hostingController.view.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0),
hostingController.view.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0),
]
NSLayoutConstraint.activate(constraints)
}
}
并以类似的方式使用它。
func makeUIView(context: Context) -> UICollectionView {
let collectionView = UICollectionView(
frame: .zero,
collectionViewLayout: MyCustomCollectionViewLayout()
)
collectionView.register(HostingCollectionViewCell.self, forCellWithReuseIdentifier: "HostingCell")
let dataSource = UICollectionViewDiffableDataSource<Section, Member>(collectionView: collectionView) { collectionView, indexPath, member in
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HostingCell", for: indexPath) as? HostingCollectionViewCell
for subview in cell?.contentView.subviews ?? [] {
subview.removeFromSuperview()
}
let swiftUIView = SomeSwiftUIView()
.onTapGesture {
// Equivalent of didTapItemAt...
}
cell?.host(UIHostingController(rootView: firefighterView))
return cell
}
context.coordinator.dataSource = dataSource
collectionView.clipsToBounds = false
collectionView.backgroundColor = .clear
collectionView.showsVerticalScrollIndicator = false
// Populated Datasource
return collectionView
}
此makeUIView
是struct SwiftUICollectionView: UIViewRepresentable
视图的一部分。