Performant macOS and iOS TextView with line numbers and much more. (NSTextView/UITextView reimplementation)
The goal of this project is to build NSTextView/UITextView replacement reusable component utilizing TextKit 2 framework. due to many good reasons.
The component is mainly developed to serve Swift Studio needs as a source code editor.
TextKit 2 was announced during WWDC 2021 as a TextKit 1 replacement for text layout and whatnot. Apple announced that NSTextView
, the view component specialized for text editing, will adopt TextKit 2 and provide support along TextKit 1 bit. As I started to learn more about NSTextView
+ TextKit2, I realized that as of today (Feb 2022), neither NSTextView
nor TextKit 2 classes are fully functional. Along the way, I reported several bug reports to Apple requesting DTS (support tickets). Eventually, I got blocked by specific bugs that pushed me to start this project.
The financial sustainability of the project is possible thanks to the ongoing contributions from our GitHub Sponsors
STTextView is already well-suited as a text editor component. However, it still needs improvements before the release of v1.0
Suggest or vote for new features: Feature Requests
STTextView
is distributed using the Swift Package Manager. Install it in a project by adding it as a dependency in your Package.swift
manifest or through “Package Dependencies” in Xcode project settings
let package = Package(
dependencies: [
.package(url: "https://github.com/krzyzanowskim/STTextView", from: "0.9.6")
]
)
The demo applications TextEdit and TextEdit.SwiftUI lets you explore the library.
Plugins in an STTextView component offer additional functionalities and customizations beyond the simple text display. They enhance the core capabilities of the text view by adding features such as syntax highlighting, word count tracking, and more. These plugins expand the STTextView’s utility while maintaining a modular and adaptable software structure.
The TextView
is a SwiftUI view that wraps the STTextView.
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))
}
}
The STTextView
is an NSView
subclass and can be initialized like any other view. It has an API that is similar to that of NSTextView.
import STTextView
let textView = STTextView()
view.addSubView(textView)
(macOS) add to scroll view
let textView = STTextView()
let scrollView = NSScrollView()
scrollView.documentView = textView
let scrollView = STTextView.scrollableTextView()
let textView = scrollView.documentView as! STTextView
The text view can be customized in a variety of ways.
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
Add gutter with line numbers
textView.showLineNumbers = true
textView.gutterView?.drawSeparator = true
(macOS) Enable an optional search-and-replace find interface inside a view, usually a scroll view.
textView.isIncrementalSearchingEnabled = true
textView.textFinder.incrementalSearchingShouldDimContentView = true
List of TextKit 2 issues and bugs related to NSTextView and the TextKit framework I reported to Apple so far:
… I’m aware that the list of issues is not complete. I managed to workaround most of the problems in STTextView.
(ST prefix stands for “Swift sTudio” because SS is not good prefix since 1939)
Start a new discussion topic or a pull request.
I’d love to hear from you! Get in touch via X/Twitter @krzyzanowskim, Mastodon @krzyzanowskim@mastodon.social.
If you are creating an open-source application under a license compatible with the GNU GPL license v3, you may use STTextView under the terms of the GPLv3.
Get one starting from €5.
If you want to use STTextView to develop non-open-sourced products and applications, the Commercial license is appropriate. With this option, your source code is kept proprietary. You won’t have to change your whole application source code to an open-source license. Purchase a STTextView Commercial License