Высота Uilabel с использованием boundigRect

#ios #swift #string #uilabel

#iOS #быстрый #строка #uilabel

Вопрос:

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

Моя проблема в том, что текст отображается правильно, только если он не превышает определенного количества строк, в случае, если текст слишком длинный, он обрезается, и я не понимаю, почему

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

это то, что я использую, чтобы получить высоту текста.

Где я ошибаюсь?

 private func estimateTextHeight()-> CGFloat {
        let text = (toastView.textLbl.text ?? "") as NSString
        let attribute: [NSAttributedString.Key: Any] = [.font: toastView.textLbl.font!]
        return text.boundingRect(with: .init(width: 300, height: 2000), options: .usesLineFragmentOrigin, attributes: attribute, context: nil).height
    }

 private func updateToast(icon: UIImage?) -> Void {
        let height = estimateTextHeight() 

        toastView.heightAnchor.constraint(equalToConstant: height).isActive = true
    }
 

Ответ №1:

Чтобы рассчитать высоту метки, попробуйте выполнить следующее:

  extension String {
    func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
        
        let constraintRect = CGSize(width: width,
                                    height: .greatestFiniteMagnitude)
        
        let boundingBox = self.boundingRect(with: constraintRect,
                                            options: .usesLineFragmentOrigin,
                                            attributes: [.font: font],
                                            context: nil)
        return ceil(boundingBox.height)
    }
}