使用 AttributedString 立即格式化 UITextView
Instantly format a UITextView using AttributedString
我正在开发一个 macOS 富文本编辑器,它为文本视图的每一行应用预定义的样式。
为了格式化这些行,我使用 NSAttributedString
,然后将该字符串插入到我的 UITextView
中。为了让事情变得更简单,我使用了一个名为 SwiftRichString.
的工具
我的代码如下所示。它简单明了,效果很好。
import Cocoa
import SwiftRichString
import AppKit
class ViewController: NSViewController {
@IBOutlet var textView: NSTextView!
override func viewDidLoad() {
super.viewDidLoad()
// Format the string
let style = Style {
[=10=].font = NSFont(name: "Arial", size: 20)
[=10=].color = NSColor.black
[=10=].alignment = .center
}
let attributedText = "Hello World!".set(style: style)
// Add formatted string to the text view
textView.textStorage?.append(attributedText)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
现状:
用户正在输入格式化的行。然后当用户点击 Return 并输入内容时,新行的格式 returns 返回到 UITextView 的默认样式。
我想要的:
用户正在输入特定格式的行,然后他点击 Return。下一行 应该 格式化为另一种预定义样式 on-the-go.
示例:
- 用户正在输入 Title 行。当前样式为 (Arial, bold, 20pt).
- 他打Return.
- 下一行的样式应为普通 使用预定义样式(Arial,12pt)的文本。
重要提示:
在我上面的代码中,我能够轻松地格式化该行,因为它是硬编码的。我真正的问题是,我怎样才能立即格式化下一行,因为下一行将由用户输入。样式应在用户开始编写之前应用到下一行。
也许你可以使用 optional func textViewDidChange(_ textView: UITextView)
https://developer.apple.com/documentation/uikit/uitextviewdelegate/1618599-textviewdidchange
更改后,只需解析文本、查找新行、拆分它们并应用您想要的所有样式
好的,我刚刚想出了如何使用 typingAttributtes
来解决这个问题(感谢@Larme 的提示)。
// Define next attributes
let attributes: [NSAttributedString.Key: Any] = [
.foregroundColor: NSColor.red,
.font: NSFont(name: "Arial", size: 12)!,
]
// Assign attributes to the text view typing attributes
textView.typingAttributes = attributes
非常简单!
请原谅跑题了。如果您正在制作文本编辑器,您可以考虑使用 table 视图,其中每个文本行都是一个单元格 - 这对您作为程序员来说是额外的工作,但它会显着提高性能。这就是 Xcode 编辑器的构建方式。
我正在开发一个 macOS 富文本编辑器,它为文本视图的每一行应用预定义的样式。
为了格式化这些行,我使用 NSAttributedString
,然后将该字符串插入到我的 UITextView
中。为了让事情变得更简单,我使用了一个名为 SwiftRichString.
我的代码如下所示。它简单明了,效果很好。
import Cocoa
import SwiftRichString
import AppKit
class ViewController: NSViewController {
@IBOutlet var textView: NSTextView!
override func viewDidLoad() {
super.viewDidLoad()
// Format the string
let style = Style {
[=10=].font = NSFont(name: "Arial", size: 20)
[=10=].color = NSColor.black
[=10=].alignment = .center
}
let attributedText = "Hello World!".set(style: style)
// Add formatted string to the text view
textView.textStorage?.append(attributedText)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
现状:
用户正在输入格式化的行。然后当用户点击 Return 并输入内容时,新行的格式 returns 返回到 UITextView 的默认样式。
我想要的:
用户正在输入特定格式的行,然后他点击 Return。下一行 应该 格式化为另一种预定义样式 on-the-go.
示例:
- 用户正在输入 Title 行。当前样式为 (Arial, bold, 20pt).
- 他打Return.
- 下一行的样式应为普通 使用预定义样式(Arial,12pt)的文本。
重要提示:
在我上面的代码中,我能够轻松地格式化该行,因为它是硬编码的。我真正的问题是,我怎样才能立即格式化下一行,因为下一行将由用户输入。样式应在用户开始编写之前应用到下一行。
也许你可以使用 optional func textViewDidChange(_ textView: UITextView)
https://developer.apple.com/documentation/uikit/uitextviewdelegate/1618599-textviewdidchange
更改后,只需解析文本、查找新行、拆分它们并应用您想要的所有样式
好的,我刚刚想出了如何使用 typingAttributtes
来解决这个问题(感谢@Larme 的提示)。
// Define next attributes
let attributes: [NSAttributedString.Key: Any] = [
.foregroundColor: NSColor.red,
.font: NSFont(name: "Arial", size: 12)!,
]
// Assign attributes to the text view typing attributes
textView.typingAttributes = attributes
非常简单!
请原谅跑题了。如果您正在制作文本编辑器,您可以考虑使用 table 视图,其中每个文本行都是一个单元格 - 这对您作为程序员来说是额外的工作,但它会显着提高性能。这就是 Xcode 编辑器的构建方式。