将自定义属性应用于属性字符串的范围时,键入属性不会在该范围内拥有自定义属性,为什么这样做?

时间:2019-02-27 08:22:34

标签: ios swift uitextview nsattributedstring nsmutableattributedstring

我正在为选定的文本应用自定义属性,效果很好,但是当我在已应用的属性文本中修改文本时,新输入的文本没有自定义属性。如果这是标准行为,那么我该怎么做才能实现我想要的行为。

我在做什么:

  1. 在UiTextView中输入文字,例如:“这是示例文本”
  2. 选择所有文本
  3. 应用自定义属性
  4. 日志归因文本

日志输出

  

这是示例文本{       MyCustomAttributeKey = CustomAttributeValue;       NSFont =“ font-family:\”。SFUIText \“; font-weight:常规; font-style:常规; font-size:14.00pt”;       NSParagraphStyle =“路线4,LineSpacing 0,ParagraphSpacing 0,ParagraphSpacingBefore 0,HeadIndent 0,TailIndent 0,   FirstLineHeadIndent 0,LineHeight 0/0,LineHeightMultiple 0,   LineBreakMode 0,制表符(\ n 28L,\ n 56L,\ n 84L,\ n 112L,\ n
  140L,\ n 168L,\ n 196L,\ n 224L,\ n 252L,\ n 280L,\ n
  308L,\ n 336L \ n),DefaultTabInterval 0,块(\ n),列表(\ n),   BaseWritingDirection 0,断字因子0,TighteningForTruncation   不,HeaderLevel 0“;}

  1. 现在在文本之间插入文本,例如“ modified”,修改后的完整文本:“ This amodified sample text”
  2. 日志归因文本

现在我正在获取日志输出(日志经过格式化以更加清晰)

  

这是{MyCustomAttributeKey = CustomAttributeValue; NSFont =“   字体家族:\“。SFUIText \”; font-weight:正常;字体样式:正常;   font-size:14.00pt“; NSParagraphStyle =” Alignment 4,LineSpacing 0,   ParagraphSpacing 0,ParagraphSpacingBefore 0,HeadIndent 0,TailIndent   0,FirstLineHeadIndent 0,LineHeight 0/0,LineHeightMultiple 0,   LineBreakMode 0,制表符(\ n 28L,\ n 56L,\ n 84L,\ n 112L,\ n 140L,\ n 168L,\ n   196L,\ n 224L,\ n 252L,\ n 280L,\ n 308L,\ n 336L \ n),DefaultTabInterval 0,   块(\ n),列表(\ n),BaseWritingDirection 0,HyphenationFactor 0,   TighteningForTruncation NO,HeaderLevel 0“;}

     

修改后的{NSFont =“ font-family:\”。SFUIText \“; font-weight:正常;   字体样式:正常; font-size:14.00pt“; NSParagraphStyle =” Alignment   4,LineSpacing 0,ParagraphSpacing 0,ParagraphSpacingBefore 0,   HeadIndent 0,TailIndent 0,FirstLineHeadIndent 0,LineHeight 0/0,   LineHeightMultiple 0,LineBreakMode 0,制表符(\ n 28L,\ n 56L,\ n 84L,\ n   112L,\ n 140L,\ n 168L,\ n 196L,\ n 224L,\ n 252L,\ n 280L,\ n 308L,\ n   336L \ n),DefaultTabInterval 0,块(\ n),列表(\ n),   BaseWritingDirection 0,断字因子0,TighteningForTruncation   不,HeaderLevel 0“;}

     

示例文本{MyCustomAttributeKey = CustomAttributeValue; NSFont =“   字体家族:\“。SFUIText \”; font-weight:正常;字体样式:正常;   font-size:14.00pt“; NSParagraphStyle =” Alignment 4,LineSpacing 0,   ParagraphSpacing 0,ParagraphSpacingBefore 0,HeadIndent 0,TailIndent   0,FirstLineHeadIndent 0,LineHeight 0/0,LineHeightMultiple 0,   LineBreakMode 0,制表符(\ n 28L,\ n 56L,\ n 84L,\ n 112L,\ n 140L,\ n 168L,\ n   196L,\ n 224L,\ n 252L,\ n 280L,\ n 308L,\ n 336L \ n),DefaultTabInterval 0,   块(\ n),列表(\ n),BaseWritingDirection 0,HyphenationFactor 0,   TighteningForTruncation NO,HeaderLevel 0“;}

我的预期输出是将自定义属性应用于新输入的文本,但事实并非如此。如何实现呢?

谢谢。

我的ViewController和代码:

//  ViewController.swift


import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    let customAttributeStringKey: NSAttributedStringKey = NSAttributedStringKey.init(rawValue: "MyCustomAttributeKey")

    @IBOutlet weak var textV: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }


    @IBAction func applyCustomAttribute(_ sender: Any) {
        let attributedString : NSMutableAttributedString = textV.attributedText.mutableCopy() as! NSMutableAttributedString
        attributedString.addAttribute(customAttributeStringKey, value: "CustomAttributeValue", range:textV.selectedRange)
        textV.attributedText = attributedString
    }

    @IBAction func logAttribute(_ sender: Any) {
        print(textV.attributedText.description)
    }

}

ViewController UI

P.S。 :使用NSAttributedStringKey.underlineStyle(而不是自定义属性)进行了实验,

attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range:textV.selectedRange)

在这种情况下,修改后的文本也会获得underlineStyle属性,那么customAttribute有什么问题?

编辑:进度

我尝试在textview侦听器方法中设置键入属性,如下所示,这部分可行...但是有一个

  func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
         if(isApplyAttributesClicked){  //this flag is true when we have applied attributes by clicking Apply attribute button
            textV.typingAttributes = [customAttributeStringKey.rawValue:"CustomAttributeValue"]
        }
        return true
    }

但是现在的问题是,每当从键盘上选择预测或自动更正时,下一个键入单词的键入属性就没有自定义属性。 任何帮助将不胜感激。

0 个答案:

没有答案