ios swift 에서 키패드/키보드 닫기/숨기기 또는 키패드에 input Field가 가려졌을때 처리
그리고 카톡 입력할때처럼 input Field가 키패드 위에 딱 붙어서 동작하는 경우에 대해서 알아보자~~
이것만 보면 swift에서 키패드 관련된 대부분의 처리를 다 할 수 있지 않을까 생각된다.
도움되었으면 공감이라도~~
1. inputText 입력시 배경을 터치하면 키패드가 내려가게 코딩
Tab Gesture 사용
- 라이브러리에서 Tap Gesture Recognizer 를 선택하여 화면의 뷰로 드래그&드롭 한다.
- 우클릭후 아이콘을 소스로 드래그&드롭한후 Action을 추가한다.
- type : UITapGestureRecognizer 로 설정한다.
- Action 코드에 키패드 내리는 코드를 추가한다.
ex)
@IBAction func tapBackground(_ sender: UITapGestureRecognizer) {
self.view.endEditing(true) // 키패드 닫힘
// self.inputField.resignFirstResponder() // inputField 컨트롤에서 사용시 키패드 닫힘
// self.inputField.endEditing(true) // inputField 컨트롤에서 사용시 키패드 닫힘
}
touchesBegan 메서드를 override 하여 사용
ex)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
UITapGestureRecognizer 를 코딩으로 구현
ex)
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
tapGesture.cancelsTouchesInView = true
self.view.addGestureRecognizer(tapGesture)
}
@objc func hideKeyboard() { // 배경 터치시 키보드 내리기
self.view.endEditing(true)
}
2. 키패드에 의해서 input Text 가 가려서 안보일 경우
키패드에 가려진 input Text 보이게하기
ex)
--------------------------------------------------------------------------------------------------
import UIKit
class ViewController: UIViewController ,UITextFieldDelegate{
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: .UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: .UIKeyboardWillHide, object: nil)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func keyboardWillShow(_ sender: Notification) {
self.view.frame.origin.y = -150 // Move view 150 points upward
}
func keyboardWillHide(_ sender: Notification) {
self.view.frame.origin.y = 0 // Move view to original position
}
--------------------------------------------------------------------------------------------------
출처: https://zeddios.tistory.com/127 [ZeddiOS]
input Text를 키보드 위에 붙여서 사용하기
- text field 와 button을 view 안에 넣고, view의 바닥 높이를 조절하는 방식으로 한다.
- 키패드가 올라오고 내려오는 애니메이션 속도를 맞추어 동일하게 한다.
- 바닥 높이 조절을 위해 constraints 를 이용한다.
- @IBOutlet weak var inputViewBottomMargin: NSLayoutConstraint!
- inputViewBottomMargin.constant 값을 설정하여 높이를 조절한다.
- 키패드의 높이는 실제 키패드의 높이 - 세이프에어리어의 바닥높이 이다.
- NotificationCenter 에 옵저버를 추가하여 키패드가 올라올때, 키패드가 내려올때 동작하는 함수를 설정한다.
class ViewController: UIViewController {
@IBOutlet weak var inputViewBottomMargin: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
// 키보드 관련 옵저버 설정을 해야함.
// 키보드 올라올때
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(noti:)), name: UIResponder.keyboardWillShowNotification, object: nil)
// 키보드 내려올때
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
// 키보드 보이기
@objc func keyboardWillShow(noti: Notification){
let notiInfo = noti.userInfo!
//키보드 높이 가져오기 위해
let keyboardFrame = notiInfo[UIResponder.keyboardFrameEndUserInfoKey] as! CGRect
let height = keyboardFrame.size.height - self.view.safeAreaInsets.bottom
inputViewBottomMargin.constant = height
let animationDuration = notiInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
// 애니메이션 효과를 키보드 애니메이션 시간과 동일하게
UIView.animate(withDuration: animationDuration) {
self.inputViewBottomMargin.constant = height
self.view.layoutIfNeeded()
}
}
// 키보드 숨기기
@objc func keyboardWillHide(noti: Notification){
let notiInfo = noti.userInfo!
let animationDuration = notiInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
// 애니메이션 효과를 키보드 애니메이션 시간과 동일하게
UIView.animate(withDuration: animationDuration) {
self.inputViewBottomMargin.constant = 0
self.view.layoutIfNeeded()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
'iOS' 카테고리의 다른 글
iOS 하이브리드앱(기본 브라우져 사용)에서시 서버의 Front에서 javaScript를 이용하여 연동하는 방법 (0) | 2019.05.10 |
---|---|
iOS 앱 아이콘 만들기 (0) | 2019.05.07 |
아이폰 오버스크롤 및 웹뷰 바운스 막기 (0) | 2015.05.29 |
iOS 인증 및 배포 절차(in-house 방식) (0) | 2015.05.22 |
오브젝티브 C : 상속, NSObject, 프로토콜, id형 (0) | 2014.08.01 |