打字时TextView中的AttributedText [重复]

Posted

技术标签:

【中文标题】打字时TextView中的AttributedText [重复]【英文标题】:AttributedText in TextView while typing [duplicate] 【发布时间】:2016-04-29 22:38:00 【问题描述】:

我有一个 textView,我试图给它一个属性文本。我尝试在 shouldChangeTextInRange 内实现它,但它因超出索引范围而崩溃。

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool  

   if myTextView 
      textView.attributedText = addAttributedText(1, text: text, fontsize: 13)

      let newText = (textView.text as NSString).stringByReplacingCharactersInRange(range, withString: text)
      let numberOfChars = newText.characters.count

      return numberOfChars < 20
   
   return true


 func addAttributedText(spacing:CGFloat, text:String, fontsize: CGFloat) -> NSMutableAttributedString 
    let attributedString = NSMutableAttributedString(string: text, attributes: [NSFontAttributeName:UIFont(
        name: "Font",
        size: fontsize)!])
    attributedString.addAttribute(NSKernAttributeName, value: spacing, range: NSMakeRange(0, text.characters.count))
    return attributedString


我尝试将带有空文本的属性字符串添加到 viewDidLoad 中的 textView,但这没有帮助。这就是为什么我认为在shouldChangeTextInRange 上这样做是合适的

(请注意我的addAttributedText 方法非常适用于其他文本视图)

如果我使用它,在一个字符输入中,它会写入 2x 并崩溃。处理将 textView 的文本转换为正在键入的属性文本的正确方法是什么。

【问题讨论】:

你看过这里吗? ***.com/questions/16716525/… @EugeneZhenyaGordin 不幸的是,这种类型的objective-c 对我来说似乎很困惑,因为我没有任何先验知识。你能帮忙吗? 【参考方案1】:

这是我尝试从上面的链接转换的代码,它可能有错误,但我希望它能够帮助你。

func formatTextInTextView(textView: UITextView) 

    textView.scrollEnabled = false
    var selectedRange: NSRange = textView.selectedRange
    var text: String = textView.text!
    // This will give me an attributedString with the base text-style
    var attributedString: NSMutableAttributedString = NSMutableAttributedString(string: text)
    var error: NSError? = nil
    var regex: NSRegularExpression = NSRegularExpression.regularExpressionWithPattern("#(\\w+)", options: 0, error: error!)
    var matches: [AnyObject] = regex.matchesInString(text, options: 0, range: NSMakeRange(0, text.length))

    for match: NSTextCheckingResult in matches 
        var matchRange: NSRange = match.rangeAtIndex(0)
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: matchRange)
    
    textView.attributedText = attributedString
    textView.selectedRange = selectedRange
    textView.scrollEnabled = true

编辑:在原始帖子中没有看到 Swift 的答案,这是链接:***.com/a/35842523/1226963

【讨论】:

这里有一个 swift 版本:***.com/a/35842523/4705339 完美运行 太棒了!!!很高兴它有帮助! @EugeneZhenyaGordin 这个答案抄袭自***.com/a/35842523/1226963,没有署名。请勿将其他人的答案作为您自己的答案发布。 首先,我发布了它的链接。 senty 问我是否可以转换它,我确实使用了这个链接:objectivec2swift.com/#/converter/code。 senty 实际上找到了您稍后提到的 swift 版本,它在 cmets 中。我是否有罪,我的答案被标记为答案? 我可以添加对这个帖子的引用没问题

以上是关于打字时TextView中的AttributedText [重复]的主要内容,如果未能解决你的问题,请参考以下文章

当 TextView 是匹配约束时,如何对齐 TextView 中的文本?

滚动时textView在viewController中的位置

如何在单击 TextView 中的文本链接时打开浏览器 [重复]

单击TextView中的电话号码或电子邮件地址时出错

当滚动超出最初可见的范围时,无法访问 recyclerview 中的 textview

ScrollView中的TextView - 在键入时禁用自动滚动?