本项目旨在简化 NSTextView
的使用。 最初是为了支持 TextKit 1 而构建的。 但是,现在的主要目标是支持 TextKit 2。
dependencies: [
.package(url: "https://github.com/ChimeHQ/TextViewPlus")
],
targets: [
.target(
name: "UseCoreFunctionality",
dependencies: ["TextViewPlus"]
),
.target(
name: "UseBaseTextView",
dependencies: [.product(name: "BaseTextView", package: "TextViewPlus")]
),
]
这是一个仅支持 TextKit 2 的 NSTextView
子类,旨在尽可能减少修改。 只有在需要正确功能时才允许进行修改。 它旨在作为 NSTextView
的直接替代品,并应保持与现有子类的兼容性。 其行为适用于所有类型的文本。
scrollRangeToVisible
错误 (FB13100459) 的解决方法textContainerInset
以解决更多的 scrollRangeToVisible
错误NSTextViewDelegate.textView(_:, doCommandBy:) -> Bool
:paste
, pasteAsRichText
, pasteAsPlainText
onKeyDown
、onFlagsChanged
、onMouseDown
的钩子continuousSelectionNotifications
配置选择通知的传递用于计算视图中文本范围的便捷方法。
func textRange(for rect: NSRect) -> NSRange
var visibleTextRange: NSRange
用于计算选择范围/位置的便捷方法。
var selectedTextRanges: [NSRange]
var selectedContinuousRange: NSRange?
var insertionLocation: Int?
样式更改可能非常耗时,但在某些常见情况下,此方法速度更快。
func updateFont(_ newFont: NSFont, color newColor: NSColor)
计算显示文本的边界矩形。
func boundingRect(for range: NSRange) -> NSRect?
func boundingRect(forGlyphRange range: NSRange) -> NSRect?
func boundingSelectionRects(forRange range: NSRange) -> [NSRect]
以编程方式修改 NSTextStorage
中底层富文本字符串,并支持代理回调和撤消。
func replaceCharacters(in range: NSRange, with attributedString: NSAttributedString)
// with undo supported
func replaceString(in range: NSRange, with attributedString: NSAttributedString)
更改 NSTextView
的行为可能很棘手,并且通常涉及与整个系统(NSLayoutManager
、NSTextContainer
、NSScrollView
等)的复杂交互。
public var wrapsTextToHorizontalBounds: Bool
在 macOS 13 之前的版本中,TextKit 2 无法正确应用渲染属性。 您可以替换此 NSTextLayoutFragment
来解决此问题。
extension YourClass: NSTextLayoutManagerDelegate {
func textLayoutManager(_ textLayoutManager: NSTextLayoutManager, textLayoutFragmentFor location: NSTextLocation, in textElement: NSTextElement) -> NSTextLayoutFragment {
let range = textElement.elementRange
switch textElement {
case let paragraph as NSTextParagraph:
return ParagraphRenderingAttributeTextLayoutFragment(textParagraph: paragraph, range: range)
default:
return NSTextLayoutFragment(textElement: textElement, range: range)
}
}
}
func enumerateLineFragments(for range: NSRange, block: (NSRect, NSRange) -> Void)
func enumerateLineFragments(for rect: NSRect, block: (NSRect, NSRange) -> Void)
我很乐意收到你的来信! 通过 issue 或 pull request 联系。
我更喜欢协作,如果您有类似的项目,我很乐意找到合作的方式。
为了提高可访问性,我更喜欢使用制表符进行缩进。 但是,我宁愿你使用你想要的系统并创建一个 PR,也不希望你因为空格而犹豫不决。
参与此项目即表示您同意遵守贡献者行为准则。