#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)
}
}