如何在UITextView上的每一行添加文本

时间:2015-07-25 14:29:38

标签: ios iphone xcode swift

我很难解决这个问题。我的目标是在textview的每一行添加一个特定的文本。到目前为止,我的应用程序一直运行良好,但是当我单击添加文本时,它仍然只添加到文本视图的第一行,我希望能够将它添加到textview的每一行。到目前为止,我有这个:

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

任何帮助将不胜感激,谢谢!

3 个答案:

答案 0 :(得分:2)

这个问题有点复杂。所以我们应该把它分解成更具体的部分。

  1. 编写一个函数来计算包含a的textView的高度 具有特定字体和一定宽度的字符串。

  2. 将textView的字符串分解为由空格分隔的单词数组,假设该行按字而不是 字符。

  3. 通过逐步添加每个单词来重建字符串,以使用第1部分中的函数找到高度变化的位置。
  4. 第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部分:将每个单词一次追加到一起以找出新行的位置,以便我们可以附加行前缀。

    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放回textView!

    您可以在此处进行的一项优化是在第一种方法中重复使用tempView而不是每次都重新创建它,但我会将更改留给您......因为它实际上取决于您实际需要的效率是。

答案 1 :(得分:0)

也许\ n会有帮助吗?

textToCopy.text =" test(textToCopy.text)\ n"

答案 2 :(得分: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"
    }