【发布时间】:2020-10-12 21:40:49
【问题描述】:
我发现 SwiftUI Text 视图非常容易使用自定义设计创建标签。所以我想将它用作常规 UIKit UICollectionViewCell 的视图。
这是我目前的代码(您可以在 Xcode 11 中复制和粘贴)。
import SwiftUI
import UIKit
struct ContentView: View {
var body: some View {
CollectionComponent()
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
struct CollectionComponent : UIViewRepresentable {
func makeCoordinator() -> CollectionComponent.Coordinator {
Coordinator(data: [])
}
class Coordinator: NSObject, UICollectionViewDataSource, UICollectionViewDelegate {
var data: [String] = []
init(data: [String]) {
for index in (0...1000) {
self.data.append("\(index)")
}
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
data.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! GenericCell
cell.customView.rootView = AnyView(
Text(data[indexPath.item]).font(Font.title).border(Color.red)
)
return cell
}
}
func makeUIView(context: Context) -> UICollectionView {
let layout = UICollectionViewFlowLayout()
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
layout.scrollDirection = .vertical
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.dataSource = context.coordinator
cv.delegate = context.coordinator
cv.register(GenericCell.self, forCellWithReuseIdentifier: "cell")
cv.backgroundColor = .white
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
return cv
}
func updateUIView(_ uiView: UICollectionView, context: Context) {
}
}
open class GenericCell: UICollectionViewCell {
public var customView = UIHostingController(rootView: AnyView(Text("")))
public override init(frame: CGRect) {
super.init(frame: frame)
configure()
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}
private func configure() {
contentView.addSubview(customView.view)
customView.view.preservesSuperviewLayoutMargins = false
customView.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
customView.view.leftAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leftAnchor),
customView.view.rightAnchor.constraint(equalTo: contentView.layoutMarginsGuide.rightAnchor),
customView.view.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor),
customView.view.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor),
])
}
}
第一屏不错。
但是当我滚动到可见屏幕的末尾时,它看起来像
自动调整单元格大小我做错了什么吗?或者这只是更多的 SwiftUI 错误?
[编辑] 我已经接受了 SwiftUI 的答案,但是如果有人可以按照这个问题的要求为我提供使用 UIKit 的修复程序,我会接受。
【问题讨论】:
-
你可以使用列表中的列表来代替 UIcollectionview 来获得相同的效果
-
@yawnobleix 怎么样?
-
今晚在家的时候我会尽量贴出来
-
添加了答案
-
您能否告诉我们您是如何使用
UICollectionView和UICollectionViewCell完成此任务的?这将有助于指出具体问题 - 这可能是“目前”您无法在SwiftUI中执行此操作。例如,这是与任一组件中的自动布局约束相关的问题吗?这是否与尝试在不存在的 SwiftUI 中创建集合视图的“惰性”或“可重用单元”版本有关?或者这是一个动态类型问题?换句话说(请原谅我玩文字游戏)-您将如何在仅限UIKit的应用程序中处理此问题?
标签: swift uicollectionview uicollectionviewcell swiftui