Skip to content

wontaeyoung/AutoHeightEditor

Repository files navigation

Platform Deployments UseFor SPM License Github

Read English Translation


AutoHeightEditor๋Š” Dynamic Height ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์ปค์Šคํ…€ TextEditor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.


์ œ์ž‘ ๋ฐฐ๊ฒฝ

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ œ๊ฐ€ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•ด์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ ์ปค์Šคํ…€ TextEditor์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋™์ ์œผ๋กœ ๋†’์ด๊ฐ€ ์กฐ์ ˆ๋˜๋Š” ์ž…๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์ด์—ˆ๋Š”๋ฐ, iOS 16๋ถ€ํ„ฐ๋Š” TextField์˜ axis ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด Dynamic Height๋กœ ๋™์ž‘ํ•˜๋Š” ์ž…๋ ฅ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ ์ตœ์†Œ ์ง€์›๋ฒ„์ „์ด iOS 15.0+๋กœ ๊ฒฐ์ •๋˜์—ˆ๊ณ , ์—ฌ๋Ÿฌ ์ค„์˜ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” TextEditor๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ API๋กœ ์ œ๊ณต๋˜๋Š” TextEditor๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹ ๋ถ„๋“ค์€ ๊ณต๊ฐํ•˜์‹œ๊ฒ ์ง€๋งŒ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด TextField์— ๋น„ํ•ด ๋ถ€์กฑํ•˜๊ณ , ํŠนํžˆ ๋ณ„๋„๋กœ ๋†’์ด๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋†’์ด๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ ์ ˆํ•œ ๋†’์ด๋ฅผ ๋™์ ์œผ๋กœ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” AutoHeightEditor๋ฅผ ์ปค์Šคํ…€์œผ๋กœ ์ œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์ œ์ž‘ ๋ฐฐ๊ฒฝ ๋ฐ ๊ตฌํ˜„ ๊ณผ์ •์€ ๋ธ”๋กœ๊ทธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๊ฐœ

AutoHeightEditor๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Dynamic Height์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํฐํŠธ ๋†’์ด, ํ–‰๊ฐ„, ํ…์ŠคํŠธ ๊ธธ์ด, ๊ฐœํ–‰๋ฌธ์ž๋ฅผ ํ†ตํ•ด์„œ ์ ์ ˆํ•œ ๋†’์ด๋กœ TextEditor์˜ ๋†’์ด๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.


์ฃผ์š” ๋กœ์ง

  1. ํ…์ŠคํŠธ์—์„œ \n(๊ฐœํ–‰๋ฌธ์ž)์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  2. TextEditor์˜ ๊ฐ€๋กœ ๊ธธ์ด์™€ ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์ž๋™ ์ค„๋ฐ”๊ฟˆ์ด ๋ช‡ ๋ฒˆ ์ผ์–ด๋‚˜์•ผํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  3. 1๋ฒˆ๊ณผ 2๋ฒˆ์„ ํ•ฉ์ณ์„œ ์ด ์ค„๋ฐ”๊ฟˆ ํšŸ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  4. ํฐํŠธ ํฌ๊ธฐ, ํ–‰๊ฐ„, ์ค„๋ฐ”๊ฟˆ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ TextEditor์˜ ์ด ๋†’์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ํŽธ์˜

์ตœ์†Œ 1์ค„ ~ maxLine๊นŒ์ง€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋”ฐ๋ผ ๋†’์ด๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ์ตœ๋Œ€ ๋ผ์ธ ์ˆ˜, ์‚ฌ์šฉ๋˜๋Š” ํฐํŠธ, ํ–‰๊ฐ„, ํ™œ์„ฑํ™” ์—ฌ๋ถ€์™€ ๊ฐ™์€ ์„ ํƒ์‚ฌํ•ญ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์•„์„œ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งž์ถฐ์„œ ์ˆ˜์ •ํ•œ๋งŒํผ, ์ œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•˜์—ฌ ์•„๋ž˜ ์‚ฌํ•ญ๋“ค์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • isEnabled๋ฅผ ๋ฐ”์ธ๋”ฉ ๋ฐ›์•„์„œ ์™ธ๋ถ€์—์„œ ํ™œ์„ฑํ™” ์—ฌ๋ถ€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ๊ณ ์ •์œผ๋กœ ์กด์žฌํ•˜๋Š” Border ์ŠคํŠธ๋กœํฌ ์‚ฌ์šฉ ์—ฌ๋ถ€ ์„ ํƒ ๊ฐ€๋Šฅ
  • Disabled ์•ˆ๋‚ด ๋ฌธ๊ตฌ ์ปค์Šคํ…€ ๊ฐ€๋Šฅ
  • ์ „๋‹ฌ๋ฐ›์€ ์ •๊ทœ์‹ ๋งค์น˜ ์—ฌ๋ถ€๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ๋ฐ”์ธ๋”ฉ ๋œ Bool ๋ณ€์ˆ˜์— ๋ฐ˜์˜

์ œ์ž‘ ๋ฐฐ๊ฒฝ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ iOS 16์€ ์•„์ง์€ ์‹ค๋ฌด์— ์ ์šฉํ•˜๊ธฐ ๋ถ€๋‹ด์Šค๋Ÿฌ์šด ๋ฒ„์ „์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ TextEditor๊ฐ€ ์ฒ˜์Œ ๋‚˜์˜จ iOS 14๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.



ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ

public init (
    text: Binding<String>,
    font: Font = .body,
    lineSpace: CGFloat = 2,
    maxLine: Int,
    hasBorder: Bool,
    isEnabled: Binding<Bool>,
    disabledPlaceholder: String,
    regExpUse: RegExpUse
)



text: Binding<String>

์—๋””ํ„ฐ์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ์ž…๋ ฅ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ฃผ์ž…ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.



font: Font

ํ…์ŠคํŠธ์— ์ ์šฉํ•  ํฐํŠธ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. Default Value๋กœ body๊ฐ€ ์ฃผ์ž…๋˜๊ณ , ์›ํ•˜๋Š” ๋‹ค๋ฅธ ํฐํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฃผ์ž…ํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.



lineSpace: CGFloat

ํ…์ŠคํŠธ ๋ผ์ธ ์‚ฌ์ด์— ๋“ค์–ด๊ฐ€๋Š” ํ–‰ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. Default Value๋กœ 2๊ฐ€ ์ฃผ์ž…๋˜๊ณ , ์›ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ฃผ์ž…ํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.



maxLine: Int

์—๋””ํ„ฐ์˜ ๋†’์ด๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ƒํ•œ์„  ๋ผ์ธ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋ผ์ธ์ด ๋Š˜์–ด๋‚  ๋•Œ maxLine๊นŒ์ง€ ์—๋””ํ„ฐ ๋†’์ด๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , ๊ทธ ์ดํ›„๋กœ๋Š” ๋Š˜์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.



hasBorder: Bool

๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” Stroke์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Stroke๋Š” Gray ์ปฌ๋Ÿฌ์— 20์˜ CornerRadius ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.



isEnabled: Binding<Bool>

์—๋””ํ„ฐ์˜ ํ™œ์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ฃผ์ž…ํ•˜๊ณ , ์กฐ์ ˆํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.



disabledPlaceholder: String

์—๋””ํ„ฐ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋˜์–ด์žˆ์„ ๋•Œ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ˆ๋‚ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ๊ตฌ์ž…๋‹ˆ๋‹ค.



public enum RegExpUse {
    case use(pattern: String, isMatched: Binding<Bool>)
    case none
}

regExpUse: RegExpUse

์ •๊ทœ์‹ ๋งค์น˜ ์—ฌ๋ถ€๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด none, ์‚ฌ์šฉํ•œ๋‹ค๋ฉด use๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

pattern์€ ๋งค์นญ์— ์‚ฌ์šฉํ•  ์ •๊ทœ์‹ ํŒจํ„ด, isMatched๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๊ณ  ํ™œ์šฉํ•  ๋ฐ”์ธ๋”ฉ ๊ฐ’์ž…๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์ •๊ทœ์‹์„ ๊ฒ€์‚ฌํ•ด์„œ isMatched์— ์ „๋‹ฌ๋œ ๋ฐ”์ธ๋”ฉ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.



์‚ฌ์šฉ ๊ฐ€์ด๋“œ

์šฐ์„  ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์„ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด AutoHeightEditor๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” 1์ค„ ๋†’์ด๋กœ ์‹œ์ž‘ํ•˜๊ณ , ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ์— ๋”ฐ๋ผ ์ตœ๋Œ€ 5์ค„๊นŒ์ง€ ๋†’์ด๊ฐ€ ๋™์ ์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

\n(๊ฐœํ–‰๋ฌธ์ž)๋กœ ์ผ์–ด๋‚˜๋Š” ์ค„๋ฐ”๊ฟˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ…์ŠคํŠธ๊ฐ€ ๊ธธ์–ด์ ธ์„œ ์ž๋™์œผ๋กœ ์ค„๋ฐ”๊ฟˆ์ด ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„๋„ ๊ฐ์ง€ํ•ด์„œ ๋†’์ด์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 5,
    hasBorder: true,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .none)



์ตœ๋Œ€ ๋ผ์ธ ์ˆ˜ ์ˆ˜์ •ํ•˜๊ธฐ

maxLine์„ ์กฐ์ •ํ•ด์„œ ์ตœ๋Œ€ ๋†’์ด ๋ผ์ธ ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” 7์„ ์ „๋‹ฌํ•ด์„œ 7์ค„ ๋†’์ด๊นŒ์ง€ ๋Š˜์–ด๋‚˜๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 7,
    hasBorder: true,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .none)



ํฐํŠธ์™€ ํ–‰ ๊ฐ„๊ฒฉ ์ˆ˜์ •ํ•˜๊ธฐ

ํ˜„์žฌ ๋ฒ„์ „์—์„œ๋Š” SwiftUI์˜ ๊ธฐ๋ณธ Font ํƒ€์ž…์— ์—†๋Š” ๊ฐ’์€ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํฐํŠธ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์—์„œ UIFont์™€ 1:1 ๋งคํ•‘์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

font์™€ lineSpace์—๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ body์™€ 2๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฐ’์ด ์žˆ๋‹ค๋ฉด Default Value ๋Œ€์‹ ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” title2์™€ 10์„ ์ „๋‹ฌํ•ด์„œ ํฐํŠธ ์‚ฌ์ด์ฆˆ๋ฅผ ํ‚ค์šฐ๊ณ  ํ–‰ ๊ฐ„๊ฒฉ๋„ ๋„“ํ˜€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    font: .title2,
    lineSpace: 10,
    maxLine: 5,
    hasBorder: true,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .none)



Border Stroke ์ปค์Šคํ…€

hasBorder๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํ…Œ๋‘๋ฆฌ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ Stroke๋Š” Gray ์ปฌ๋Ÿฌ์— 20์˜ CornerRadius ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” hasBorder์˜ ๊ฐ’์„ false๋กœ ์ „๋‹ฌํ•˜์—ฌ ํ…Œ๋‘๋ฆฌ๋ฅผ ์‚ญ์ œํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 5,
    hasBorder: false,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .none)



์™ธ๋ถ€์—์„œ overlay๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋””์ž์ธ์„ ์ปค์Šคํ…€์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” ๊ธฐ๋ณธ ํ…Œ๋‘๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๊ณ , overlay๋กœ ์‚ฌ๊ฐํ˜• ์Šคํƒ€์ผ์˜ ํ…Œ๋‘๋ฆฌ๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 5,
    hasBorder: false,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .none)
.overlay {
    Rectangle()
        .stroke()
}



์—๋””ํ„ฐ ์‚ฌ์šฉ ํ™œ์„ฑํ™” ๊ด€๋ฆฌ

isEnabled๋กœ ์—๋””ํ„ฐ์˜ ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์ˆ˜์‹  ์—ฌ๋ถ€๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

disabled๋˜๋ฉด disabledPlaceholder์— ์ „๋‹ฌ๋œ ํ…์ŠคํŠธ๋ฅผ ํ”Œ๋ ˆ์ด์Šคํ™€๋”๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” isEnabled์— ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , Toggle๋กœ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 5,
    hasBorder: ๏ฟฝtrue,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .none)



๋งŒ์•ฝ์— ๋”ฐ๋กœ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค๋ฉด .constant()๋กœ ์ „๋‹ฌํ•˜๊ณ , disabledPlaceholder์—๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 5,
    hasBorder: true,
    isEnabled: .constant(true),
    disabledPlaceholder: "",
    regExpUse: .none)



์ •๊ทœ์‹ ์‚ฌ์šฉ

regExpUse ์—ด๊ฑฐํ˜•์œผ๋กœ ์ •๊ทœ์‹ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด none, ์‚ฌ์šฉํ•œ๋‹ค๋ฉด use๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

use์—๋Š” ์—ฐ๊ด€๊ฐ’์œผ๋กœ pattern๊ณผ isMatched๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pattern ํ…์ŠคํŠธ์™€ ๋น„๊ตํ•  ์ •๊ทœ์‹ ํŒจํ„ด ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

isMatched๋Š” ์™ธ๋ถ€์—์„œ ๋ฐ”์ธ๋”ฉ ๋ฐ›๋Š” ๋ณ€์ˆ˜๋กœ, ๋‚ด๋ถ€์—์„œ ์ •๊ทœ์‹ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ์—…๋ฐ์ดํŠธ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” ์ด๋ฉ”์ผ ํŒจํ„ด์„ ์ „๋‹ฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 5,
    hasBorder: true,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .use(
        pattern: #"^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]{2,3}+$"#,
        isMatched: $isMatched))



ํฌ์ปค์Šค ๊ด€๋ฆฌ

@FocusState๋ฅผ ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์— ํฌํ•จ์‹œํ‚ค๋ฉด ์ตœ์†Œ ์ง€์›๋ฒ„์ „์ด iOS 15๋กœ ์˜ฌ๋ผ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ฅผ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ์‚ฌ์šฉ์„ฑ๋ณด๋‹ค ์ง€์› ๋ฒ„์ „์„ ๋‚ฎ์ถ”๋Š”๊ฒŒ ๋” ๋ฉ”๋ฆฌํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ง€์› ๋ฒ„์ „์ด 15.0+์ธ ์‚ฌ์šฉ์ž๋ถ„๋“ค์€ ์™ธ๋ถ€์—์„œ FocusState๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํฌ์ปค์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AutoHeightEditor(
    text: $text,
    maxLine: 5,
    hasBorder: true,
    isEnabled: $isEnabled,
    disabledPlaceholder: "This editor has been disabled",
    regExpUse: .none)
.focused($isFocus)



๋‹คํฌ๋ชจ๋“œ ์ง€์›

ํ˜„์žฌ ๋ฒ„์ „์—์„œ๋Š” ๋‚ด๋ถ€ foregroundColor์—์„œ primary๋ฅผ ์ „๋‹ฌํ•ด์„œ ๊ธฐ๋ณธ์ ์ธ ๋‹คํฌ๋ชจ๋“œ ๋Œ€์‘๋งŒ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ œ๊ณต Stroke ์ƒ‰์ƒ์€ ๋ผ์ดํŠธ / ๋‹คํฌ ๋ชจ๋‘ gray ๊ณ ์ •์ž…๋‹ˆ๋‹ค.



๋ผ์ด์„ผ์Šค

AutoHeightEditor๋Š” MIT ๋ผ์ด์„ผ์Šค์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด๋Š” ๋ผ์ด์„ผ์Šค์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


์ž‘์„ฑ์ž: ์›ํƒœ์˜

About

SwiftUI TextEditor API with dynamic height by text line

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages