Использование представлений SwiftUI для UICollectionViewCell внутри UIViewRepresentable CollectionView (UICollectionView с оболочкой)
Я должен заменить существующий SwiftUI List
просмотров с UICollectionView
(поскольку дизайн приложения был обновлен, а новый дизайн довольно сложен для SwiftUI, поэтому его пришлось реализовать как пользовательский UICollectionViewFlowLayout
)
Таким образом, представления (которые теперь будут (или частью)UICollectionViewCell) уже реализованы в SwiftUI, и я не хотел переписывать их в Swift. Представления сложны с точки зрения написания кода макета, что, по-видимому, было довольно просто с использованием SwiftUI.
Я мог бы найти некоторую помощь в создании такого вида коллекции, как этот, но немного о том, как разместить существующее быстрое представление пользовательского интерфейса внутри UICollectionViewCell
Любая помощь / предложения / ссылки будут оценены.
Спасибо
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
Посмотреть.