Skip to content

oscbyspro/DiffableTextViews

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

DiffableTextViews

An open source package for as-you-type formatting in SwiftUI.

Number Pattern

Features

Feature Description
⌨️ Responsive Formats text as you type
πŸͺ„ Automagical Binds text to appropriate types
βœ”οΈ Proper Validates and autocorrects
πŸ› οΈ Versatile Uses snapshots and attributes
πŸƒβ€β™‚οΈ Performant O(n) differentiation algorithms
🏝️ Standalone Uses no remote dependencies
πŸ“– Open 100% transparent

Installation

How to install this package.

Xcode (SPM)

  1. Select https://github.com/oscbyspro/DiffableTextViews
  2. Select a VERSIONED release (5.0.0)

Package.swift

.package(url: "https://github.com/oscbyspro/DiffableTextViews", from: "5.0.0"),

Requirements

Version Swift iOS iPadOS Mac Catalyst tvOS
5.0.0+ 5.7+ 15.0+ 15.0+ 15.0+ 15.0+

Apps

The example app provides quick-and-easy-to-use customization tools.

Number Pattern
Number Pattern

Installation

Download this package and compile/run it with Xcode.

Views

DiffableTextField

A text field that binds values and formats them as you type.

Features

Feature Description
πŸ“± SwiftUI Value, style, done
⛰️ Environment Uses environment values
πŸ”Ž Focus Supports SwiftUI.FocusState

Environment

environment(\.locale, _:)
environment(\.layoutDirection, _:)
diffableTextViews_autocorrectionDisabled(_:)
diffableTextViews_font(_:)
diffableTextViews_foregroundColor(_:)
diffableTextViews_multilineTextAlignment(_:)
diffableTextViews_onSubmit(_:)
diffableTextViews_submitLabel(_:)
diffableTextViews_textContentType(_:)
diffableTextViews_textFieldStyle(_:)
diffableTextViews_textInputAutocapitalization(_:)
diffableTextViews_tint(_:)
diffableTextViews_toolbarDoneButton(_:)

Styles

NumberTextStyle (Source, Tests)

A style that binds localized numbers using various formats.

Features

Feature Description
πŸͺ™ Values Decimal, Double, (U)Int(8-64)
❔ Optional Standard and optional values
🎨 Formats Number, currency and percent
🧱 Bounds Clamps values to bounds
🏹 Precision Up to 38 digits of precision
🏞️ Locales Supports Foundation.Locale
2️⃣ Bilingual Accepts local and ASCII inputΒ 

Examples

Number

import DiffableTextViews
import SwiftUI

//*============================================================================*
// MARK: * Number [...]
//*============================================================================*

struct ContentView: View {
    
    typealias Amount = Decimal // Decimal, Double, (U)Int(8-64), Optional<T>
    
    //=------------------------------------------------------------------------=
    
    @State var amount = 0 as Amount
    @State var currencyCode = "SEK"
    @State var locale = Locale(identifier: "sv_SE")
    
    //=------------------------------------------------------------------------=
    
    var body: some View {
        DiffableTextField(value: $amount) {
            .currency(code: currencyCode)
            // .bounds((0 as Amount)...) // autocorrects while view is in focus
            // .precision(integer: 1..., fraction: 2) // default is appropriate
            // .locale(Locale(identifier: "en_US")).constant() // ignores sv_SE
        }
        .environment(\.locale, locale)
        .diffableTextViews_font(.body.monospaced())
        .diffableTextViews_keyboardType(.decimalPad)
    }
}

PatternTextStyle (Source, Tests)

A style that processes characters laid out in custom patterns.

Features

Feature Description
🏁 Pattern Characters are laid out as described by a pattern
β™ŸοΈ Placeholders Placeholders represent not-yet-assigned values
✊ Independance Supports multiple placeholders with different rules
πŸ‘» Invisibility Pattern suffix can easily be \.hidden()

Examples

Pattern

import DiffableTextViews
import SwiftUI

//*============================================================================*
// MARK: * Pattern [...]
//*============================================================================*

struct ContentView: View {
    
    typealias Number = String // Array<Character>
    
    //=------------------------------------------------------------------------=
    
    @State var number = Number("123456789")
    
    //=------------------------------------------------------------------------=
    
    var body: some View {
        DiffableTextField(value: $number) {
            .pattern("+## (###) ###-##-##")
            .placeholders("#") { $0.isASCII && $0.isNumber }
            // .hidden(true) // hides pattern beyond last real value
            // .equals(()) // skips comparisons and discards changes
        }
        .diffableTextViews_font(.body.monospaced())
        .diffableTextViews_keyboardType(.numberPad)
    }
}

WrapperTextStyle(s) (Source, Tests)

Decorative styles that modify the behavior of their content.

Style Description
constant() Prevents style transformations
equals(_:) Binds the style's equality to a proxy
standalone() Grants ownership of the style's cache
prefix(_:) Adds a prefix to the style
suffix(_:) Adds a suffix to the style