UITextView 富文本编辑
UITextView rich text editing
我需要使用支持以下功能的 UITextView 实现文本编辑器:
- Bold/Italic/Underline
- 颜色、字体、字号变化
- 段落对齐方式
- 列表格式(项目符号、编号等)
- 在文本视图中任意位置自定义选择文本并更改属性
到目前为止,我已经设法在没有 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
我需要使用支持以下功能的 UITextView 实现文本编辑器:
- Bold/Italic/Underline
- 颜色、字体、字号变化
- 段落对齐方式
- 列表格式(项目符号、编号等)
- 在文本视图中任意位置自定义选择文本并更改属性
到目前为止,我已经设法在没有 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