테마 정보 페이지 | 한글 쿼티 키보드 |
---|---|
다양한 사이즈의 화면에서 레이아웃이 깨지지 않게 표시
다양한 기기에서
한글 입력 시 낱자의 결합, 이동, 음절 분리 같은 동작을 수행하기위해 조합 중인 텍스트(inputTextBuffer)와 조합이 완료된 텍스트(inputText)를 별도로 저장하고, 조합 중인 텍스트의 상태를 세분화
/// 조합이 완료된 입력 텍스트
private var inputText: String
/// 입력 텍스트 중 현재 조합 중인 텍스트를 처리하기 위한 임시 저장 공간
private var inputTextBuffer: HangulComponents
/// 현재 조합 중인 텍스트의 상태
private var state: State
/// 현재 조합 중인 텍스트와 조합이 완료된 텍스트
private var outputText: String {
inputText + inputTextBuffer.toSyllabel
}
enum State: String {
/// 버퍼가 비워진 상태
case none
/// 버퍼에 초성이 있는 상태
case leadingConsonant
/// 버퍼에 초성과 홑모음 중성이 있는 상태
case leadingConsonantAndSingleVowel
/// 버퍼에 초성과 겹모음 중성이 있는 상태
case leadingConsonantAndDoubleVowel
/// 버퍼에 초성, 중성과 홑받침이 있는 상태
case leadingConsonantAndVowelAndSingleTrailingConsonant
/// 버퍼에 초성, 중성, 겹받침이 있는 상태
case leadingConsonantAndVowelAndDoubleTrailingConsonant
/// 버퍼에 홑모음 중성이 있는 상태
case singleVowel
/// 버퍼에 겹모음 중성이 있는 상태
case doubleVowel
}
조합 단계에서 낱자의 결합이 유효한지 판단
// 버퍼에 초성과 홑모음 중성이 있는 상태
case .leadingConsonantAndSingleVowel:
if !value.isVowel {
inputTextBuffer.addComponent(value, for: .trailingConsonant)
state = .leadingConsonantAndVowelAndSingleTrailingConsonant
} else {
// 버퍼의 홑모음 중성과 입력한 홑모음 중성을 결합하여 유효한 겹모음을 만들 수 있는지 확인
if (inputTextBuffer.vowel.firstCharacterAsString + value).isVowel {
// 유효한 겹모음일 경우 조합 중인 글자에 추가
inputTextBuffer.addComponent(value, for: .vowel)
state = .leadingConsonantAndDoubleVowel
} else {
// 유효하지 않은 겹모음인 경우 조합을 끝내고 새로운 조합을 시작
flush()
inputTextBuffer.addComponent(value, for: .vowel)
state = .singleVowel
}
}
- Frameworks: UIKit, Custom Keyboard Extension
- Tools: Xcode 16
- Language: Swift 5
dahee (홍다희) | Sole (진연서) |
---|---|
- 키보드 기능구현 | - UI 구현 |