2015-07-25 2 views
2

Мне сложно решить это. Моя цель - добавить конкретный текст в каждую строку текстового поля. Пока мое приложение работает хорошо, но когда я нажимаю, чтобы добавить текст, он продолжает добавлять только в первую строку текстового вида, я хочу, чтобы он мог добавлять его в каждую строку текстового поля. До сих пор у меня есть следующее:Как добавить текст в каждую строку в UITextView

@IBAction func alertView(sender: AnyObject) { 
    textToCopy.selectedRange = NSMakeRange(0,0) 
    textToCopy.text = "test\(textToCopy.text)" 

Любая помощь будет оценена, спасибо!

ответ

2

Эта проблема имеет немного сложности. Поэтому мы должны разбить его на более конкретные части.

  1. Написать функцию, чтобы вычислить высоту TextView, содержащий строки с определенным шрифтом и определенной шириной.

  2. Перерыв строки textView в массив слов, разделенных пробелами, при условии, что линия разбивается словом, а не символ.

  3. 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 в первом методе, а не воссоздавать его каждый раз, но я оставлю это изменение до вас .. поскольку это действительно зависит от того, насколько эффективно вам на самом деле нужно быть.

0

Возможно, \ n будет полезна?

textToCopy.text = «тест (textToCopy.text) \ п»

+0

Это не сработало. Он запускает только новую строку, однако текст продолжает добавляться в начало текстового поля вместо начала новой строки. Спасибо, что ответили. – developercool7

+0

Затем попробуйте в раскадровке, чтобы изменить свойство NUMBER OF LINES на ноль. Ноль означает бесконечное количество строк. Свойство принадлежит UITextView – IamMashed

0

Так что если у вас есть переменное количество строк, чтобы добавить, вы должны хранить их в array, а затем попробовать это:

@IBOutlet weak var textToCopy: UITextView! 



@IBAction func alertView(sender: AnyObject) { 
    for var index = 0; index < numOfStringsToAdd; ++index { 
     textToCopy.text! += "My next string \n" 
    } 
Смежные вопросы