SwiftUI UIR представляет таблицу - PullRequest
0 голосов
/ 23 апреля 2020

Я использую 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
        }
    }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Попробуйте .lineLimit(nil) для ваших элементов Text ()

Ограничение строки указывает интерфейсу пользователя обрезаться после указанного c количества строк. lineLimit(nil) означает, что Text () должен переноситься без ограничений.

Ссылка: https://developer.apple.com/documentation/swiftui/text/3276908-linelimit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...