Я использую UIRepresentable для создания табличного представления. Ячейки содержат текст различной длины. По некоторым причинам некоторые из ячеек обрезают текст.
Как бы убедиться, что высота ячеек будет пропорциональна содержимому ячеек, а текст не будет усечен?
import SwiftUI
class HostingCell: UITableViewCell { // just to hold hosting controller
var host: UIHostingController<AnyView>?
}
struct SmsTableView:UIViewRepresentable {
var rows: [HistoryStruct]
func makeUIView(context: Context) -> UITableView {
let collectionView = UITableView(frame: .zero, style: .plain)
collectionView.translatesAutoresizingMaskIntoConstraints = false
collectionView.dataSource = context.coordinator
collectionView.delegate = context.coordinator
collectionView.separatorStyle = .none
collectionView.register(HostingCell.self, forCellReuseIdentifier: "Cell")
return collectionView
}
func updateUIView(_ uiView: UITableView, context: Context) {
}
func makeCoordinator() -> Coordinator {
Coordinator(rows: rows.reversed())
}
class Coordinator: NSObject, UITableViewDataSource, UITableViewDelegate {
var rows: [HistoryStruct]
init(rows: [HistoryStruct]) {
self.rows = rows
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
self.rows.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let tableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! HostingCell
var view: AnyView?
if(rows[indexPath.row].from != "CUSTOMER"){
view = AnyView(HStack{
VStack{
HStack(){
Spacer()
Text("\(rows[indexPath.row].content)").padding(10).foregroundColor(Color.white).background(Color.init("CustomerMessage")).cornerRadius(15)
}
HStack(){
Spacer()
Text("\(rows[indexPath.row].timestamp)").font(.custom("Heebo-Regular", size: 10)).foregroundColor(.init("MessageTime"))
}
}.padding(.trailing,10)
})
}else{
view = AnyView(HStack{
VStack{
HStack(){
Text("\(rows[indexPath.row].content)").padding(10).foregroundColor(Color.white).background(Color.init("OperatorMessage")).cornerRadius(15)
Spacer()
}
HStack(){
Text("\(rows[indexPath.row].timestamp)").font(.custom("Heebo-Regular", size: 10)).foregroundColor(.init("MessageTime"))
Spacer()
}
}.padding(.leading,10)
})
}
// create & setup hosting controller only once
if tableViewCell.host == nil {
let controller = UIHostingController(rootView: AnyView(view))
tableViewCell.host = controller
let tableCellViewContent = controller.view!
tableCellViewContent.translatesAutoresizingMaskIntoConstraints = false
tableViewCell.contentView.addSubview(tableCellViewContent)
tableCellViewContent.topAnchor.constraint(equalTo: tableViewCell.contentView.topAnchor).isActive = true
tableCellViewContent.leftAnchor.constraint(equalTo: tableViewCell.contentView.leftAnchor).isActive = true
tableCellViewContent.bottomAnchor.constraint(equalTo: tableViewCell.contentView.bottomAnchor).isActive = true
tableCellViewContent.rightAnchor.constraint(equalTo: tableViewCell.contentView.rightAnchor).isActive = true
} else {
// reused cell, so just set other SwiftUI root view
tableViewCell.host?.rootView = AnyView(view)
}
tableViewCell.setNeedsLayout()
return tableViewCell
}
}
}