SwiftUI UIRepresentable tableView单元格截断的方法

我正在使用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
        }
    }
}

解决方案:

试试 .lineLimit(nil) 在您的Text()元素上

行数限制告诉UI在特定行数后进行截断。lineLimit(nil) 意味着Text()应该没有任何限制地进行包装。

参考文献。https:/developer.apple.comdocumentationswiftuitext3276908-linelimit

给TA打赏
共{{data.count}}人
人已打赏
解决方案

从表单输入中检索数据

2022-5-11 13:00:14

解决方案

找最小时钟角的逻辑应该是什么?[关闭]

2022-5-11 13:00:16

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索