UITextView 富文本编辑

UITextView rich text editing

我需要使用支持以下功能的 UITextView 实现文本编辑器:

到目前为止,我已经设法在没有 NSTextStorage 的情况下做到了,但似乎我达到了极限。例如,要更改字体,我使用 UIFontPickerViewController 并按如下方式更改字体:

      func fontPickerViewControllerDidPickFont(_ viewController: UIFontPickerViewController) {
         if let selectedFontDesc = viewController.selectedFontDescriptor {
            let font = UIFont(descriptor: selectedFontDesc, size: selectedFontDesc.pointSize)
            self.selectedFont = font
        
            self.textView.typingAttributes = [NSAttributedString.Key.foregroundColor: self.selectedColor ?? UIColor.white, NSAttributedString.Key.font: self.selectedFont ?? UIFont.preferredFont(forTextStyle: .body, compatibleWith: nil)]
        
           if let range = self.textView.selectedTextRange, let selectedFont = selectedFont {
             let attributedText = NSMutableAttributedString(attributedString: self.textView.attributedText)
            
             let location =  textView.offset(from: textView.beginningOfDocument, to: range.start)
             let length = textView.offset(from: range.start, to: range.end)
             let nsRange = NSRange(location: location, length: length)
            
             attributedText.setAttributes([NSAttributedString.Key.font : selectedFont], range: nsRange)
            
             self.textView.attributedText = attributedText
         }
        
     }
 }

这可行,但问题是它会重置所选文本的颜色和其他属性。我需要了解一种方式,在这种方式下,所选文本的现有属性不会受到干扰。我怀疑这样做的方法是使用 NSTextStorage,但我在互联网上找不到任何好的东西来解释正确使用 NSTextStorage 来实现这一点。

问题是这个调用:

attributedText.setAttributes...

正如您所观察到的,这使得您提供的属性(此处为字体)成为该范围的 属性。相反,您想 添加 您的字体属性到 existing 属性:

https://developer.apple.com/documentation/foundation/nsmutableattributedstring/1414304-addattributes