SwiftUI TextField에 키보드 초점 맞추기


현재 아래와 같이 화면을 구현하고 있다.

EE48BD4A-934E-405E-9BA8-A020C78BE50C

위 화면과 같이 항목들이 많아지면 ScriollView를 이용하여 구현을 하여야 한다. 여기서 문제가 하나 발생한다. 사용자에게서 입력을 받을 때 키보드가 아래에서 올라오는데 위에 보이는 TextField에 대해서는 보이기 때문에 상관이 없지만 위 사진에서 아래에 위치한 TextField를 클릭하면 키보드에 가려져서 안보이게 된다. 따라서 이번 포스트에서는 TextField를 클릭하여 키보드가 올라올 때 보이도록 설정을 하여줄 것이다.

내가 참고한 사이트는 여기이다. 잘 모르겠으면 해당 링크를 보면서 따라해봐도 좋다. 영상길이도 그렇게 길지 않으므로 충분히 따라할 수 있을 것이다.

1. KeyboardHandler.swift 파일 추가

import Combine
import SwiftUI

final class KeyboardHandler: ObservableObject {
    @Published private(set) var keyboardHeight: CGFloat = 0
    
    private var cancellable: AnyCancellable?
    
    private let keyboardWillShow = NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)
        .compactMap { ($0.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect)?.height }
    
    private let keyboardWillHide = NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)
        .map { _ in CGFloat.zero }
    
    init() {
        cancellable = Publishers.Merge(keyboardWillShow, keyboardWillHide).subscribe(on: DispatchQueue.main)
            .assign(to: \.self.keyboardHeight, on: self)
    }
        
}
  • 현재 진행중인 프로젝트 내에 KeyboardHandler.swift 파일을 생성하여 위 코드를 작성해주었다. 물론 파일명과 클래스명은 달라도 괜찮다.

2. 뷰 구조체에 필드명과 속성을 추가한다.

적용하고자 하는 뷰에 아래의 코드를 추가해준다.

@StateObject private var keyboardHandler = KeyboardHandler() //struct view 내 변수로 선언

ScrollView(.vertical){
}
.padding(.bottom, keyboardHandler.keyboardHeight)
.animation(.default)
  • 변수를 추가해준다.
  • 여백을 하단쪽에 키보드 높이만큼 주도록 설정한다.
  • (선택) 애니메이션을 추가해준다. 애니메이션을 추가해주면 부드럽게 전환된다.

구현 결과

7F9FA31F-7B79-4E11-A74E-6293C17DC733

  • 위 코드들을 적용하여 구현하면 위 사진과 같이 TextField를 터치하면 키보드가 열리면서 TextField에 포커스가 맞춰진다.