Авторазмер UITableViewCell программно на основе содержимого - PullRequest
0 голосов
/ 22 мая 2018

Я создаю приложение, которое имитирует общение с реальным пользователем, для макета журнала чата, который я использую UITableView, потому что я очень новичок в Swift, но раньше я программировал на других языках, я создаю весь макет программно.

В настоящее время мой ViewController выглядит следующим образом

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var navigationBar: UINavigationBar!
    @IBOutlet weak var tableView: UITableView!

    let rows: [String] = [
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam euismod nunc id nulla ultricies tempus. Mauris a euismod nunc."
    ]

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return rows.count;
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "AiMessageCell") as! AiMessageCell

//        cell.textLabel?.text = rows[indexPath.row]
//        cell.textLabel?.numberOfLines = 0;

        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
//        tableView.beginUpdates()
//        tableView.endUpdates()

        return UITableViewAutomaticDimension;
    }

    override func viewDidLoad() {
        super.viewDidLoad()

//        tableView.estimatedRowHeight = 140
//        tableView.rowHeight = UITableViewAutomaticDimension;

        tableView.register(AiMessageCell.self, forCellReuseIdentifier: "AiMessageCell")
        tableView.register(UserMessageCell.self, forCellReuseIdentifier: "UserMessageCell")
        tableView.register(UserSelectionCell.self, forCellReuseIdentifier: "UserSelectionCell")
    }
}

он просто занимает одну строку и на основе этого (в настоящее время не передает текст в ячейку) выводит одну единственную строку в мой UITableView

и у меня есть AiMessageCell логика

class AiMessageCell: UITableViewCell, NSLayoutManagerDelegate {

//    @IBOutlet weak var wrapper: UIView!

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        let wrapper = UIView(
            frame: CGRect(
                x: 10, y: 10,
                width: UIScreen.main.bounds.width - 10 - 10,
                height: 45
            )
        )

        let balloon = UIView(
            frame: CGRect(
                x: 40, y: 0,
                width: 80,
                height: 45.5
            )
        )
        balloon.layer.cornerRadius = 10;
        balloon.backgroundColor = UIColor.init(
            red: CGFloat(240/255.0),
            green: CGFloat(240/255.0),
            blue: CGFloat(240/255.0),
            alpha: CGFloat(1.0)
        );

        let message = UITextView(
            frame: CGRect(
                x: 10, y: 5,
                width: balloon.layer.bounds.width - 10,
                height: balloon.layer.bounds.height - 10
            )
        );
        message.text = "What is shown in the scrollable content area of a scroll view is determined by its subviews. ?";
        message.font = UIFont.systemFont(ofSize: 16);
        message.isEditable = false;
        message.isScrollEnabled = false;
        message.isSelectable = false;
        message.backgroundColor = UIColor.clear;
        message.layoutManager.delegate = self;

        let avatar = UIImageView(
            image: UIImage(named: "avatar")
        );

        avatar.clipsToBounds = true;
        avatar.layer.cornerRadius = 15;

        let calculated = message.sizeThatFits(
            CGSize(width: wrapper.bounds.width - 50, height: CGFloat.greatestFiniteMagnitude)
        )

        avatar.frame = CGRect(x: 0, y: calculated.height - 25, width: 30, height: 30)

        message.frame.size = CGSize(width: calculated.width, height: calculated.height)
        balloon.frame.size = CGSize(width: calculated.width + 20, height: calculated.height + 5);
        wrapper.frame.size = CGSize(width: wrapper.bounds.width, height: balloon.bounds.height);

        balloon.addSubview(message)

        wrapper.addSubview(balloon)
        wrapper.addSubview(avatar)

        wrapper.backgroundColor = UIColor.purple
        contentView.backgroundColor = UIColor.green

        contentView.addSubview(wrapper)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setTimeout(_ delay:TimeInterval, block:@escaping ()->Void) -> Void {
        Timer.scheduledTimer(timeInterval: delay, target: BlockOperation(block: block), selector: #selector(Operation.main), userInfo: nil, repeats: false)
    }

    func layoutManager(_ layoutManager: NSLayoutManager, lineSpacingAfterGlyphAt glyphIndex: Int, withProposedLineFragmentRect rect: CGRect) -> CGFloat {
        return 5;
    }
}

здесь я создаю целую строку сообщения с аватаром пользователя и пузырем сообщения (UITextView), который автоматически изменяет размер на текст.

И тут возникает проблема, несмотря на то, что пузырь сообщения автоматически масштабируется по тексту, высота строки таблицы фиксирована.

Вот как это выглядит, я честно попробовал по крайней мере 5разные ответы от SO, но не повезло.В настоящее время я думаю, что проблема в том, что у меня нет ограничений между моим wrapper (фиолетовым блоком) и ячейками content view (зеленым блоком)

enter image description here

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я думаю, что проблема в том, что вы определяете размеры подвидов ячеек с рамкой, а не с ограничениями макета.Когда вы используете UITableViewAutomaticDimension, вам нужно правильно настроить ограничения сверху и снизу UITableViewCell.

И вместо использования делегата, я думаю, это намного чище, чем вы прокомментировали в viewDidLoad:

    tableView.estimatedRowHeight = 140
    tableView.rowHeight = UITableViewAutomaticDimension
0 голосов
/ 22 мая 2018

Вам нужно проверить ограничение в вашей раскадровке.Кажется, вы забыли ограничение от нижнего текстового блока до нижней ячейки.И затем раскомментируйте это

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