Contents

jaywcjlove/swiftui-texteditor

SwiftUI TextEditorPlus

Installation

You can add MarkdownUI to an Xcode project by adding it as a package dependency.

  1. From the File menu, select Add Packages…
  2. Enter https://github.com/jaywcjlove/swiftui-texteditor the Search or Enter Package URL search field
  3. Link Markdown to your application target

Or add the following to Package.swift:

.package(url: "https://github.com/jaywcjlove/swiftui-texteditor", from: "1.0.0")

Or add the package in Xcode.

Usage

import TextEditorPlus

struct ContentView: View {
    @State var text = """
    Hello World
    """
    @State var isEditable = true
    var body: some View {
        TextEditorPlus(text: $text)
            .textSetting(isEditable, for: .isEditable)
    }
}

Set text weight and size:

TextEditorPlus(text: $text)
    .font(.systemFont(ofSize: 24, weight: .regular))

Set editor padding:

TextEditorPlus(text: $text)
  .textSetting(23, for: .insetPadding)

Set editor background color:

TextEditorPlus(text: $text)
  .textSetting(NSColor.red, for: .backgroundColor)

Set editor text color:

TextEditorPlus(text: $text)
  .textSetting(NSColor.red, for: .textColor)

Set editor placeholder string:

TextEditorPlus(text: $text)
    //.font(NSFont(name: "pencontrol", size: 12)!)
    .font(.systemFont(ofSize: CGFloat(Float(fontSize)!), weight: .regular))
    .textSetting("Test placeholder string", for: .placeholderString)

Manipulate attributed strings with attributes such as visual styles, hyperlinks, or accessibility data for portions of the text.

TextEditorPlus(text: $text)
    .textSetting(isEditable, for: .isEditable)
    .textViewAttributedString(action: { val in
            let style = NSMutableParagraphStyle()
            style.lineSpacing = 5
            style.lineHeightMultiple = 1.2
            val.addAttribute(.paragraphStyle, value: style, range: NSRange(location: 0, length: val.length))
            return val
    })

NSMutableAttributedString Support

You can now use TextEditorPlus with NSMutableAttributedString for more advanced text formatting:

import TextEditorPlus

struct ContentView: View {
    @State var attributedText = NSMutableAttributedString(string: """
        This is an example of NSMutableAttributedString.
        You can apply rich text formatting directly!
        """)
    
    var body: some View {
        VStack {
            // Using NSMutableAttributedString binding
            TextEditorPlus(text: $attributedText)
                .textSetting(true, for: .isEditable)
                .onAppear {
                    setupAttributedText()
                }
            
            Button("Add Formatting") {
                applyFormatting()
            }
        }
    }
    
    func setupAttributedText() {
        let fullRange = NSRange(location: 0, length: attributedText.length)
        
        // Set base font
        #if os(iOS)
        attributedText.addAttribute(.font, value: UIFont.systemFont(ofSize: 16), range: fullRange)
        #else
        attributedText.addAttribute(.font, value: NSFont.systemFont(ofSize: 16), range: fullRange)
        #endif
        
        // Apply paragraph style
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 3
        paragraphStyle.paragraphSpacing = 8
        attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: fullRange)
    }
    
    func applyFormatting() {
        let highlightText = "NSMutableAttributedString"
        let range = (attributedText.string as NSString).range(of: highlightText)
        if range.location != NSNotFound {
            #if os(iOS)
            attributedText.addAttribute(.backgroundColor, value: UIColor.systemBlue, range: range)
            attributedText.addAttribute(.foregroundColor, value: UIColor.white, range: range)
            #else
            attributedText.addAttribute(.backgroundColor, value: NSColor.systemBlue, range: range)
            attributedText.addAttribute(.foregroundColor, value: NSColor.white, range: range)
            #endif
        }
    }
}

The TextEditorPlus now supports both String and NSMutableAttributedString bindings:

  • TextEditorPlus(text: $text) - for String binding
  • TextEditorPlus(text: $attributedText) - for NSMutableAttributedString binding

When using NSMutableAttributedString, the text view will preserve all formatting attributes and allow direct manipulation of the attributed string.

License

Licensed under the MIT License.

Package Metadata

Repository: jaywcjlove/swiftui-texteditor

Default branch: main

README: README.md