ResizingTextView

3.0.1

A (non)selectable, single-line/multi-line, (non)self-sizing, (non)scrollable, (un)editable text view for iOS and macOS.
mshibanami/ResizingTextView

What's New

Fixed an animation-related issue on iOS

2024-07-01T05:54:29Z

On iOS, my app Redirect Web for Safari, which uses ResizingTextView, has an issue where the animation of adding a new row to the List in SwiftUI isn't smooth.

before_converted.mov

This usually doesn't happen, and I think it's an edge case related to UITableView used inside List.

To solve it, I added a view.layoutIfNeeded() to ensure the layout is recalculated immediately. This is how it works now:

after_converted.mov

ResizingTextView

This is a SwiftUI resizing text view for iOS and macOS.

Usage

You can check how it works using the Example project. These are sample codes from the project:

// Self-sizing automatically (Default)
ResizingTextView(text: $text1)

// Fixed height, scrollable, newline characters not allowed
ResizingTextView(
    text: $text2,
    placeholder: "Placeholder",
    isScrollable: true,
    canHaveNewLineCharacters: false
)
.frame(height: 80)

// Uneditable, selectable, color/font changed
ResizingTextView(
    text: $text3,
    isEditable: false
)
.font(.boldSystemFont(ofSize: 16))
.foregroundColor(.magenta)

// Uneditable, selectable, max 2 lines
ResizingTextView(
    text: .constant("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."),
    isEditable: false,
    lineLimit: 2
)

// Uneditable, unselectable, max 2 lines
ResizingTextView(
    text: .constant("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."),
    isEditable: false,
    isSelectable: false,
    lineLimit: 2
)

// Selectable, uneditable, non greedy
ResizingTextView(
    text: .constant("Lorem ipsum"),
    isEditable: false,
    hasGreedyWidth: false
)
.background(.yellow)

#if os(iOS)
// No autocapitalization (iOS Only)
ResizingTextView(
    text: $text4,
    placeholder: "Placeholder"
)
.autocapitalizationType(.none)
#endif

// Customized textContentInset
ResizingTextView(
    text: $text5
)
#if os(macOS)
.textContainerInset(CGSize(width: 40, height: 10))
#elseif os(iOS)
.textContainerInset(UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 40))
#endif
}

Demo

iOS

Screen.Recording.2022-08-14.at.6.35.55.pm.mov

macOS

Screen.Recording.2022-08-14.at.6.33.57.pm.mov

Apps that use this package

Description

  • Swift Tools 5.6.0
View More Packages from this Author

Dependencies

  • None
Last updated: Fri May 16 2025 23:34:55 GMT-0900 (Hawaii-Aleutian Daylight Time)