Эта проблема имеет немного сложности. Поэтому мы должны разбить его на более конкретные части.
Написать функцию, чтобы вычислить высоту TextView, содержащий строки с определенным шрифтом и определенной шириной.
Перерыв строки textView в массив слов, разделенных пробелами, при условии, что линия разбивается словом, а не символ.
- Rebuild строки путем постепенного добавления каждого слова обратно, чтобы найти, где изменение высоты использует нашу функцию из части 1.
Часть 1: Вычислением высоты текста на основе от фиксированной ширины
func textHeight(text:String, attrib:[String: AnyObject], width:CGFloat) -> CGFloat{
let formattedString = NSMutableAttributedString(string: text)
formattedString.setAttributes(attrib, range: NSMakeRange(0, count(text)))
return textViewHeightFromAttributedString(formattedString, width)
}
func textViewHeightFromAttributedString(text:NSAttributedString, width:CGFloat) -> CGFloat{
//we could be more efficient by only creating this tempView once.
let tempView = UITextView()
tempView.attributedText = text;
let size = tempView.sizeThatFits(CGSizeMake(width, 10000))
return size.height
}
Часть 2: Разбить текст на массив слов и отметить шрифт как массив атрибутов и ширину UITextView.
let textContent = "I can only imagine what long string would go here. I can only imagine what long string would go here. I can only imagine what long string would go here"
let parts = textContent.componentsSeparatedByString(" ");
var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0)]
let textViewWidth:CGFloat = 100;
Часть 3: Append каждое слово вместе один в то время, чтобы выяснить, где новая линия происходит таким образом, мы можем добавить префикс строки.
let linePrefix = "ALERT:"
var adjusted = linePrefix
var lastHeight = textHeight(adjusted, attrs, textViewWidth)
for part in parts{
let spacePart = " " + part
let newHeight = textHeight(adjusted + spacePart, attrs, textViewWidth)
if newHeight > lastHeight{
adjusted += "\n" + linePrefix + spacePart;
lastHeight = newHeight
}else{
adjusted += spacePart;
}
}
Теперь положите adjusted
обратно в текст!
Одна из оптимизаций, которую вы также можете сделать здесь, заключается в том, чтобы повторно использовать tempView в первом методе, а не воссоздавать его каждый раз, но я оставлю это изменение до вас .. поскольку это действительно зависит от того, насколько эффективно вам на самом деле нужно быть.
Это не сработало. Он запускает только новую строку, однако текст продолжает добавляться в начало текстового поля вместо начала новой строки. Спасибо, что ответили. – developercool7
Затем попробуйте в раскадровке, чтобы изменить свойство NUMBER OF LINES на ноль. Ноль означает бесконечное количество строк. Свойство принадлежит UITextView – IamMashed