Как заставить UILabel отображать многострочный перенос и перенос слов?

Я пытаюсь сделать свой itemLabel UILabel многострочным и делать перенос слов, но я не могу понять, где я ошибаюсь. У меня установлено numberOfLines = 0 и .byWordWrapping. Я уверен, что это простая строка кода, которую я перепутал, но я не могу ее найти.

import UIKit
import Foundation

protocol ListItemCellDelegate {
    func setChecked(cell: ListItemCell)
}

class ListItemCell: UITableViewCell {
    var delegate: ListItemCellDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        self.delegate = nil
    }

    let cellView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.white
        view.setCellShadow()
        return view
    }()

    let checkButton: UIButton = {
        let button = UIButton(type: .custom)
        button.setImage(UIImage(named: "UnChecked"), for: .normal)
        button.setImage(UIImage(named: "Checked"), for: .selected)
        button.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        return button
    }()

    let priorityButton: UIButton = {
        let button = UIButton(type: .custom)
        button.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
        button.setTitleColor(.black, for: .normal)
        button.backgroundColor = UIColor.white
        button.layer.borderWidth = 2
        button.layer.borderColor = UIColor.black.cgColor
        button.titleLabel?.font = UIFont.init(name: "Avenir Next", size: 24)
        return button
    }()

    let itemLabel: UILabel = {
        let label = UILabel()
        label.textColor = UIColor.black
        label.font = UIFont.init(name: "Avenir Next", size: 16)
        return label
    }()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupCell()

        checkButton.addTarget(self, action: #selector(setChecked), for: .touchUpInside)
        itemLabel.translatesAutoresizingMaskIntoConstraints = false
        itemLabel.numberOfLines = 0
        itemLabel.lineBreakMode = .byWordWrapping
    }

    func setupCell() {
        addSubview(cellView)
        cellView.addSubview(checkButton)
        cellView.addSubview(priorityButton)
        cellView.addSubview(itemLabel)

        cellView.setAnchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 4, paddingLeft: 8, paddingBottom: 4, paddingRight: 8)
        checkButton.setAnchor(top: nil, left: cellView.leftAnchor, bottom: nil, right: nil, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 0, width: 50, height: 50)
        checkButton.centerYAnchor.constraint(equalTo: cellView.centerYAnchor).isActive = true
        priorityButton.setAnchor(top: nil, left: checkButton.rightAnchor, bottom: nil, right: nil, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 0, width: 40, height: 40)
        priorityButton.centerYAnchor.constraint(equalTo: checkButton.centerYAnchor).isActive = true
        itemLabel.setAnchor(top: nil, left: priorityButton.rightAnchor, bottom: nil, right: rightAnchor, paddingTop: 0, paddingLeft: 20, paddingBottom: 0, paddingRight: 20)
        itemLabel.centerYAnchor.constraint(equalTo: priorityButton.centerYAnchor).isActive = true
    }

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

    @objc private func setChecked() {
        self.delegate?.setChecked(cell: self)
    }
}

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


person Timothy Waters    schedule 03.02.2019    source источник
comment
См. stackoverflow.com/questions/ 12789013/   -  person Cristik    schedule 03.02.2019


Ответы (2)


Я делал это раньше, например, в UITableView() был массив строк, и длина строки не была фиксированной, она может быть в 3 строки или более.

Поэтому для этого я задал ограничения для UILabel(), такие как верхнее, нижнее, ведущее, замыкающее все ограничения, равные 0.

В UITableView() есть метод:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}

Попробуйте этот, он определенно поможет вам, я думаю.

person Varsha Shivhare    schedule 03.02.2019
comment
Это было частью решения. Другая часть заключалась в том, чтобы установить для heightAnchor значение ›= 60, так как это то, что я использую для своего минимального размера. Спасибо за предложение! - person Timothy Waters; 03.02.2019

В моем случае часть решения была предложена Varsha Shivhare, а другая — установить ограничение heightAnchor на >= 60, что я и использую прямо сейчас. Благодарю вас!

person Timothy Waters    schedule 03.02.2019