Build Status Platforms

TextViewPlus

本项目旨在简化 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")]
    ),
]

BaseTextView

这是一个仅支持 TextKit 2 的 NSTextView 子类,旨在尽可能减少修改。 只有在需要正确功能时才允许进行修改。 它旨在作为 NSTextView 的直接替代品,并应保持与现有子类的兼容性。 其行为适用于所有类型的文本。

NSTextView 扩展

范围

用于计算视图中文本范围的便捷方法。

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 的行为可能很棘手,并且通常涉及与整个系统(NSLayoutManagerNSTextContainerNSScrollView 等)的复杂交互。

public var wrapsTextToHorizontalBounds: Bool

TextKit 2 功能

解决方法

在 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)
        }
    }
}

TextKit 1 功能

NSLayoutManager 扩展

func enumerateLineFragments(for range: NSRange, block: (NSRect, NSRange) -> Void)
func enumerateLineFragments(for rect: NSRect, block: (NSRect, NSRange) -> Void)

贡献与协作

我很乐意收到你的来信! 通过 issue 或 pull request 联系。

我更喜欢协作,如果您有类似的项目,我很乐意找到合作的方式。

为了提高可访问性,我更喜欢使用制表符进行缩进。 但是,我宁愿你使用你想要的系统并创建一个 PR,也不希望你因为空格而犹豫不决。

参与此项目即表示您同意遵守贡献者行为准则