Skip to content

Latest commit

 

History

History
104 lines (66 loc) · 3.95 KB

README.md

File metadata and controls

104 lines (66 loc) · 3.95 KB

TextMaster

🗜Enhanced SwiftUI's TextEditor API powered by UITextView


✨ 설명

SwiftUI 에서 여러 줄의 텍스트 입력을 받기 위해선 무엇을 사용해야 할까요?

iOS 14.0+ 부터 제공되는 TextEditor가 있지만, 기능이 제한적입니다.

스크롤 기능을 켜고 끄거나, firstResponder 설정, 다이나믹 height 조절, 백그라운드 컬러 변경 등이 불가능합니다. 즉, TextEditor 로는 실무에서 필요한 복잡한 요구사항을 충족시키기 어렵습니다.

TextMaster 는 UIKit 에서 iOS 2.0+ 부터 제공되는 근본 API 인 UITextView의 기능을 SwiftUI 에서 사용할 수 있도록 wrapping 한 구조체입니다.

TextMasteriOS 15.0+ 부터 사용 가능합니다.


일부러 SPM 라이브러리로 만들지 않았습니다.

본 레포의 TextMaster.swift 파일 내부를 복사해서 가져가면, 바로 사용이 가능합니다.

커스텀이 필요한 부분은 스스로 수정해서 사용하셔도 됩니다. 😄


✨ 특징

실무에서 기획자/디자이너와 화면에 올리는 TextView 의 스펙을 이야기하다 보면, 단순히 고정 height 로 결정될 때도 있지만

간혹, 이런 스펙을 전달 받는 경우도 있습니다.

"처음엔 1줄만 표시되다가, 최대 5줄까지 늘어나고, 그 보다 많아지면 스크롤이 가능하도록 만들어주세요."

"아 근데 폰트는 24 정도로 좀 크게 해주시고요."

"처음에 이 페이지로 진입할 때, 바로 TextView 에 포커스가 들어오면서 키보드가 올라오게 해주세요."

충분히 합리적인 스펙이지만, 이 스펙을 SwiftUI 에서 구현하는 건 매우~ 까다롭습니다.

하지만 TextMaster 로는 쉽게 구현 가능합니다.

TextMaster(
  text: $text, // @State 텍스트와 바인딩
  isFocused: $isTextMasterFocused, // @FocusState 와 바인딩
  minLine: 1, // 최소 1줄 (디폴트)
  maxLine: 5, // 최대 5줄 (라인이 더 늘어나면 스크롤 기능이 작동)
  fontSize: 24, // 폰트 사이즈 (Double 타입)
  becomeFirstResponder: true) // true 가 들어가면, 이 페이지가 나타날 때 자동으로 포커스가 잡히며 키보드 올라옴

TextMaster


스펙이 이렇게 들어온다고 가정해보죠.

"최소 2줄에서 시작, 최대 4줄 까지만 커지다가 스크롤 작동, 폰트 사이즈는 16 으로 부탁드려요."

"아, 백그라운드는 quaternary 로 부탁드려요."

TextMaster(
  text: $text,
  isFocused: $isTextMasterFocused,
  minLine: 2,
  maxLine: 5,
  fontSize: 16)
  .background(.quaternary)

TextMaster2


이런 스펙은 어떨까요?

"3줄 까지만 입력 가능하도록 고정시켜 주세요. 그 이상에선 스크롤이 작동해야 합니다."

TextMaster(
  text: $text,
  isFocused: $isTextMasterFocused,
  minLine: 3,
  maxLine: 3,
  fontSize: 16)

TextMaster3


위와 같이, TextMaster는 SwiftUI 의 TextEditor API 의 한계를 벗어나고

실무에서 요구 받는 TextView 스펙을 쉽게 맞추기 위해 만들어졌습니다.

혹시나 더 추가를 원하는 기능이나 파라미터가 있다면, Issues에 제안해주세요. 감사합니다! 😄