카테고리 없음
swift 빈화면 터치 키패드 내리는 방법 알아보자.
kingarthur
2024. 7. 10. 00:53
앱에서 키보드를 띄운다음 키보드 외 화면을 누르면 키보드가 내려가는 기능을 알아 볼건데요.
이걸로 저는 엄청나게 고생을 했네요.

너무 당연히 될 줄 알았던 기능이었지만,
이것도 따로 구현이 필요하네요
그래도 생각보다 꽤 간단하니 바로 정리해 봅시다!
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
위의 짧은 코드를 추가하면 끝!!
먼저 tap을 감지하는 메소드인
UITapGestureRecognizer(target:, action:)
를 사용해줍니다.
override func viewDidLoad() {
super.viewDidLoad()
hideKeyboard()
}
func hideKeyboard() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self,
action: #selector(dismissKeyboard))
view.addGestureRecognizer(tap)
// 또는 아래처럼 작성하셔도 됩니다.
// view.addGestureRecognizer(UITapGestureRecognizer(target: self,
// action: #selector(dismissKeyboard)))
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
자 끝이에요! 생각보다 간단하죠!?
만약 모든 UIViewController에 사용하고 싶다면
Extension에 따로 만들어 놓고 메소드 호출만 하는 방법도 있습니다.
// Extension.Swift
import UIKit
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
import Foundation
import UIKit
// 방법 1 (모든 ViewController에서 hideKeyboard() 메소드만 호출해서 전체 적용)
extension UIViewController {
func hideKeyboard() {
view.addGestureRecognizer(UITapGestureRecognizer(target: self,
action: #selector(UIViewController.dismissKeyboard)))
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
mport UIKit
class ViewController: UIViewController {
lazy var textField: UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.placeholder = "여기다 글을 써주세요"
textField.backgroundColor = .white
textField.layer.cornerRadius = 5
textField.leftPadding()
return textField
}()
lazy var confirmButton: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("확인", for: .normal)
button.setTitleColor(.black, for: .normal)
button.backgroundColor = .white
button.layer.cornerRadius = 10
button.layer.borderWidth = 1
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .gray
setUpUI()
hideKeyboard()
}
// 방법 2 (특정 ViewController에서만 사용)
func hideKeyboard() {
view.addGestureRecognizer(UITapGestureRecognizer(target: self,
action: #selector(UIViewController.dismissKeyboard)))
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
private func setUpUI() {
view.addSubview(textField)
view.addSubview(confirmButton)
textField.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
textField.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
textField.widthAnchor.constraint(equalToConstant: 200).isActive = true
textField.heightAnchor.constraint(equalToConstant: 40).isActive = true
confirmButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -30).isActive = true
confirmButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
confirmButton.widthAnchor.constraint(equalToConstant: 60).isActive = true
confirmButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
}
}
import UIKit
class ViewController: UIViewController {
lazy var textField: UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.placeholder = "여기다 글을 써주세요"
textField.backgroundColor = .white
textField.layer.cornerRadius = 5
textField.leftPadding()
return textField
}()
lazy var confirmButton: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("확인", for: .normal)
button.setTitleColor(.black, for: .normal)
button.backgroundColor = .white
button.layer.cornerRadius = 10
button.layer.borderWidth = 1
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .gray
setUpUI()
}
// 방법 3 touchesBegan (특정 ViewController에서만 사용)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
private func setUpUI() {
view.addSubview(textField)
view.addSubview(confirmButton)
textField.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
textField.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
textField.widthAnchor.constraint(equalToConstant: 200).isActive = true
textField.heightAnchor.constraint(equalToConstant: 40).isActive = true
confirmButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -30).isActive = true
confirmButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
confirmButton.widthAnchor.constraint(equalToConstant: 60).isActive = true
confirmButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
}
}
나는 이걸 다양한 방식을 찾아봤는데 이게 젤 잘 되는것 같다.
작은 기능이지만... 이거 하나가 정말 많은 시간을 잡아먹게 되었다.
아직 배워야 할 것이 너무 많고... 공부를 많이 해야될 것 같다.