본문 바로가기

Swift

[Swift] 키보드 뷰에 가려지는 버튼 움직이기

나는 키보드에 가려진 뷰를 보여주게 할 때는 항상 view의 origin.y 값을 수정하여 보여주게 했다.

근데 만약 view 자체를 통째로 옮기는 것이 아니라 다른 방법을 쓰고 싶어 기록 겸 글을 쓰게 됐다.

 

1. 옵저버 생성

먼저 키보드가 show, hide 되는 이벤트를 알려줄 옵저버를 생성한다.

이 과정은 view를 움직이든, 버튼을 움직이든 공통되는 과정이다.

func moveKeyboardAndView() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

 

1-1. 옵저버 해제

옵저버를 생성해 줬다면 해제해 주는 것이 메모리 관리 측면에서 좋기 때문에 해제를 해준다.

func liftMoveKeyboardAndView() {
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}

 

2. Selector 함수 생성

keyboardWillShow, keyboardWillHide Selector 함수를 생성한다.

@objc func keyboardWillShow(notification: NSNotification) {
    // 키보드 올림
    let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
    
    if let keyboardSize = keyboardSize {
    	UIView.animate(withDuration: 0.3) {
    		self.myButtonView.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height)
    	}
    }
}

@objc func keyboardWillHide() {
    self.myButtonView.transform = .identity
}

뷰를 움직이는 방법은 흔히 아는 방법인 조건문을 사용해서 view의 origin의 y값이 0과 같을 때 움직이는 방법이 있고,

나는 CGAffineTransform(translationX:y:)를 사용해서 만들었다.

이렇게 사용하면 움직인 만큼의 값을 기억하고 있다가 키보드를 내릴 때 .identity를 해주면 원래대로 돌아와서 편하고 간단하다.

 

우선 키보드 사이즈의 값을 구하려면 NSNotification형의 매개인자를 추가해야 한다.

이러면 userInfo의 값들 중에서 딕셔너리에 UIResponder.keyboardFrameEndUserInfoKey를 키값으로 가지고 있는 값을 구해서

NSValue로 타입캐스팅 후 cgRectValue값을 가져온다.

그러면 키보드의 width, height값을 구할 수 있다.

 

etc. 흔히 사용하는? 방식

@objc func keyboardWillShow(notification: NSNotification) {
    // 키보드 올림
    let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue // 키보드 사이즈를 NSValue로 타입캐스팅

    if let keyboardSize = keyboardSize {
        UIView.animate(withDuration: 0.3) {
            if view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardSize
            }
        }
    }
}

@objc func keyboardWillHide() {
    // 키보드 내림
    if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}

 

오타나 잘못된 정보 있으면 알려주시면 감사하겠습니다.

'Swift' 카테고리의 다른 글

Swift Coding Convention에 대한 정리  (0) 2022.04.30
FirebaseAuth 기능 구현  (0) 2022.04.03
IOS) 간단한 토이프로젝트를 만들어 보다  (0) 2021.08.09
[Swift} Optional 기본 개념  (0) 2021.07.13
테이블 뷰 구현 이론  (0) 2021.07.13