STTextView

高性能的 macOSiOS 文本视图,具有行号和更多功能。(NSTextView/UITextView 的重新实现)

此项目的目标是构建 NSTextView/UITextView 的可复用组件替代品,并利用 TextKit 2 框架。原因有很多

该组件主要为 Swift Studio 的需求而开发,作为源代码编辑器

Poster

TextKit 2WWDC 2021 期间发布,作为 TextKit 1 的替代品,用于文本布局等。Apple 宣布专用于文本编辑的视图组件 NSTextView 将采用 TextKit 2,并提供与 TextKit 1 类似的支持。当我开始更多地了解 NSTextView + TextKit 2 时,我意识到截至今天(2022 年 2 月),NSTextView 和 TextKit 2 类都尚未完全发挥作用。在此过程中,我向 Apple 报告了几个错误报告,请求 DTS(支持票)。最终,我被特定的错误所阻碍,这促使我启动了这个项目。

✨ 功能特点

sttextview-30-07-2024.mp4

🤝 支持与赞助

该项目的财务可持续性得益于来自我们的 GitHub Sponsors 的持续贡献

🗓️ 路线图

建议投票新功能:功能请求

🚀 快速开始

STTextView 使用 Swift Package Manager 分发。通过在您的 Package.swift 清单文件中添加它作为依赖项,或通过 Xcode 项目设置中的“Package Dependencies”将其安装到项目中

let package = Package(
    dependencies: [
        .package(url: "https://github.com/krzyzanowskim/STTextView", from: "2.0.0")
    ]
)

演示应用程序

演示应用程序 TextEditTextEdit.SwiftUI 让您探索该库。

插件

STTextView 组件中的插件提供了超出简单文本显示之外的附加功能和自定义。它们通过添加语法高亮、字数统计等功能来增强文本视图的核心功能。这些插件扩展了 STTextView 的实用性,同时保持了模块化和可适应的软件结构。

用法

SwiftUI

TextView 是一个包装了 STTextView 的 SwiftUI 视图。

import STTextViewSwiftUI

struct ContentView: View {

    @State private var text = AttributedString("Hello World!")
    @State private var selection: NSRange?

    var body: some View {
        TextView(
            text: $text,
            selection: $selection,
            options: [.wrapLines, .highlightSelectedLine],
            plugins: [plugin1(), plugin2()]
        )
        .textViewFont(.preferredFont(forTextStyle: .body))
    }
}

创建一个 TextView

STTextView 是一个 NSView 子类,可以像任何其他视图一样初始化。它具有类似于 NSTextView 的 API。

import STTextView

let textView = STTextView()
view.addSubview(textView)

(macOS)添加到滚动视图

let textView = STTextView()
let scrollView = NSScrollView()
scrollView.documentView = textView
let scrollView = STTextView.scrollableTextView()
let textView = scrollView.documentView as! STTextView

自定义

文本视图可以通过多种方式进行自定义。

let paragraph = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
// Set the line-height to 110%
paragraph.lineHeightMultiple = 1.1
paragraph.defaultTabInterval = 28

// Default Paragraph style
textView.typingAttributes[.paragraphStyle] = paragraph

// Set default font
textView.font = NSFont.monospacedSystemFont(ofSize: 14, weight: .regular)

// Set default text color
textView.textColor = .textColor

// Set text value
textView.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ornare lobortis sem a vulputate."
textView.addAttributes([.foregroundColor: NSColor.red], range: NSRange(location: 10, length: 5))

// Wrap/No wrap lines to editor width
textView.isHorizontallyResizable = true

// Highlight the selected line.
textView.highlightSelectedLine = true

添加带有行号的边槽

textView.showLineNumbers = true
textView.gutterView?.drawSeparator = true

(macOS)在视图(通常是滚动视图)内启用可选的查找和替换界面。

textView.isIncrementalSearchingEnabled = true
textView.textFinder.incrementalSearchingShouldDimContentView = true

🐛 TextKit 2 错误报告列表

我向 Apple 报告的与 NSTextView 和 TextKit 框架相关的 TextKit 2 问题和错误列表

... 我知道问题列表并不完整。我设法在 STTextView 中解决大部分问题。

为什么是 ST?

ST 前缀代表 "Swift sTudio",因为自 1939 年以来 SS 不是一个好的前缀)

建议或反馈

发起一个新的 讨论主题 或拉取请求。

我很乐意听到您的声音!通过 X/Twitter @krzyzanowskim, Mastodon @krzyzanowskim@mastodon.social 联系我。

许可证

通过使用本软件,您接受 许可证 的条款。STTextView 软件的版权归 Marcin Krzyżanowski 所有。如果根据 GPL v3.0 使用该软件不能满足您组织法务部门的要求,则可以购买商业许可证。如有更多详情,请随时联系。