ios – Swift – NSMutableAttributedString更改UITextView中的所有文本

前端之家收集整理的这篇文章主要介绍了ios – Swift – NSMutableAttributedString更改UITextView中的所有文本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
下载我创建的示例

Example Link

我正在添加一个链接到我的UITextView,如下所示:

let systemFont = self.text.font!
                let linkAttributes = [
                    NSFontAttributeName : systemFont,NSLinkAttributeName: NSURL(string: alertController.textFields![0].text!)!] as [String : Any]

                let myAttributes2 = [ NSForegroundColorAttributeName: customGreen]

                let attributedString = NSMutableAttributedString(string: "\(urlName)")

                // Set the 'click here' substring to be the link
                attributedString.setAttributes(linkAttributes,range: NSMakeRange(0,urlName.characters.count))//(0,urlName.characters.count))

                self.text.linkTextAttributes = myAttributes2
                self.text.textStorage.insert(attributedString,at: self.text.selectedRange.location)

                let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count,length: 0)
                self.text.selectedRange = cursor
               // self.text.font = systemFont

但插入后,它会将UITextView中的所有当前文本更改为相同的字体.

因此,例如,如果我有一些粗体文本和一些更多的文本是Italic,在我添加url(这是系统字体)后,它将所有粗体/斜体文本重置为系统字体….

如果有人知道如何保留以前文本的当前字体,我真的很感激帮助.

如需进一步说明,请在下方发表评论

非常感谢任何有帮助的人!

更新

我正在更改textDidChange中的文本

if text == " " {
              //      let systemFont = self.text.font!
                //    let linkAttributes = [NSFontAttributeName : systemFont]
                    let attributes = [NSForegroundColorAttributeName: UIColor.black,NSFontAttributeName: self.text.font!] as [String : Any]

                    let attributedString = NSMutableAttributedString(string: text,attributes: attributes)
                    self.text.textStorage.insert(attributedString,at: range.location)
                    let cursor = NSRange(location: self.text.selectedRange.location+1,length: 0)
                    textView.selectedRange = cursor
                return false
            }

我有这样所以添加URL后我创建一个空格并重置字体,所以我不继续键入作为URL链接…可能是问题,但当我键入正常,并没有设置URL链接文本没有’腾出空间……

解决方法

let urlName = "google"

@IBAction func btnPressed(_ sender: Any) {

   let systemFont = UIFont.systemFont(ofSize: 11)
   let linkAttributes = [
        NSFontAttributeName : systemFont,NSLinkAttributeName: NSURL(string: "https://www.google.com")!] as [String : Any]

   let myAttributes2 = [NSForegroundColorAttributeName: UIColor.green]

   let attributedString = NSMutableAttributedString(string: "\(urlName)")

   attributedString.setAttributes(linkAttributes,urlName.characters.count))

   self.text.linkTextAttributes = myAttributes2
   self.text.textStorage.insert(attributedString,at: self.text.selectedRange.location)

   let cursor = NSRange(location: self.text.selectedRange.location + "\(urlName)".characters.count,length: 0) 
   self.text.selectedRange = cursor
}

如果要以编程方式添加文本,则应如何更新textView.
在这种情况下,请勿使用textViewDidChange(_ :)委托方法.

UPDATE

我已从DropBox下载了您的代码并对其进行了一些更改.
所以我在这里改变viewDidLoad()中的textView文本.
我创建了两个常量,以便在代码中再次使用它们,fontAttr是具有名称和大小的原始字体,fontColorAttrBlue是原始字体颜色.

let fontAttr = UIFont(name: "Helvetica-Bold",size: 20)
let fontColorAttrBlue = UIColor.blue

override func viewDidLoad() {
    super.viewDidLoad()

    let attrString = NSMutableAttributedString(string: "Hello World,How are you?",attributes: [NSFontAttributeName : fontAttr!,NSForegroundColorAttributeName: fontColorAttrBlue ])
    self.textView.delegate = self // you can set the delegate from the storyboard.
    self.textView.attributedText = attrString
}

我从webLink(_ sender:AnyObject)动作方法删除了这行代码self.textView.font = systemFont,这样就不会改变textView的字体.

最后在textView(_:shouldChangeTextIn:replacementText :)方法中,而不是检查用户是否已输入“”字符串我正在检查用户是否输入了任何字符串并重新使用我在开头创建的字体属性,以便用户链接之后输入任何类型的文本它将是原始文本而不是为类似文本分配的文本.

func textView(_ textView: UITextView,shouldChangeTextIn range: NSRange,replacementText text: String) -> Bool {
    if text.characters.count > 0 {
        let attributedString = NSMutableAttributedString(string: text,attributes: [NSFontAttributeName : self.fontAttr!,NSForegroundColorAttributeName: self.fontColorAttrBlue])
        self.textView.textStorage.insert(attributedString,at: range.location)
        let cursor = NSRange(location: self.textView.selectedRange.location+1,length: 0)
        textView.selectedRange = cursor
        return false
    }
    return true
}

猜你在找的iOS相关文章