разрывы строк не работают с UILabel в tableFooterView

У меня есть tableView с footerView. Он должен отображать простую метку.

В моем ViewController в viewDidLoad я назначаю tableFooterView так:

let footerView = MyFooterView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 0))
tableView.tableFooterView = footerView

MyFooterView — это UIView с одной меткой. Настройка этикетки выглядит так:

label.font = someFont
label.adjustsFontForContentSizeCategory = true
label.textColor = .black
label.numberOfLines = 0
label.text = "my super looooooong label that should break some lines but it doesn't."
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
addSubview(label)
NSLayoutConstraint.activate([
    label.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 40),
    label.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -40),
    label.topAnchor.constraint(equalTo: self.topAnchor, constant: 20),
    label.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -20)
])

Чтобы заставить AutoLayout работать с MyFooterView, я вызываю этот метод внутри UIViewControllers viewDidLayoutSubviews:

func sizeFooterToFit() {
    if let footerView = self.tableFooterView {
        footerView.setNeedsLayout()
        footerView.layoutIfNeeded()

        let height = footerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
        var frame = footerView.frame
        frame.size.height = height
        footerView.frame = frame

        self.tableFooterView = footerView
    }
}

Проблема. Линии в этикетке не прерываются. Я получаю следующий результат:

tableFooterView

Что сделать, чтобы метка была многострочной? Автомакет работает благодаря методу sizeFooterToFit. Единственное, высота меток не превышает одной строки.


person WalterBeiter    schedule 27.03.2020    source источник


Ответы (1)


ЗДЕСЬ - это то, как вы можете добиться этого для tableHeaderView, и в вашем случае вам просто нужно добавить код ниже в свой класс UIViewController

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    tbl.updateHeaderViewHeight()
}

И помощник extension

extension UITableView {
    func updateHeaderViewHeight() {
        if let header = self.tableFooterView {
            let newSize = header.systemLayoutSizeFitting(CGSize(width: self.bounds.width, height: 0))
            header.frame.size.height = newSize.height
        }
    }
}

И удалить

func sizeFooterToFit() {
    if let footerView = self.tableFooterView {
        footerView.setNeedsLayout()
        footerView.layoutIfNeeded()

        let height = footerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
        var frame = footerView.frame
        frame.size.height = height
        footerView.frame = frame

        self.tableFooterView = footerView
    }
}

Над кодом.

И результат будет:

введите здесь описание изображения

person Dharmesh Kheni    schedule 27.03.2020
comment
Спасибо. Но это не работает с динамическим типом. Шрифт соответственно меняется, но высота не меняется. - person WalterBeiter; 31.03.2020
comment
редактировать: он работает с dynamicType, мне просто нужно перезагрузить tableView - person WalterBeiter; 31.03.2020