본문 바로가기

iOS

[iOS] 키보드에 맞게 view 수정, NotificationCenter, UIResponder

iOS 개발을 하다보면 텍스트 필드를 누르고 키보드창이 올라와서 텍스트 필드의 내용을 확인을 못할 때가 있습니다.

 

 

그래서 일단 예시로!! 극단적으로 텍스트 필드를 하단에 둬봤습니다..

내 텍스트필드 어디갔어....

 

생각..

 

일단 생각하기로

- 일단 텍스트 뷰를 누르고 키보드가 올라올 때 뷰도 같이 올려줘야하고

- 키보드를 endEditing이나 resignFirstrespond메서드로 내렸을때도 내려줘야 합니다.

 

텍스트 필드를 눌렸을 때 키보드가 올라오는 기능은 iOS 자체 기능이기 때문에 방법이 있을거라 생각합니다. 

delegate 같은 걸 쓰나?!?!

 

어떻게 하냐!!

 

NotificationCenter 사용!!

 

예약된 옵저버들에게 정보를 broadcast 가능하게 해주는 알림 발송 메카니즘이다.

 

addObserver 메서드를 사용해서 NSNotification objects들을 감시하는 객체를 만든다..? 정도만 생각하죠.ㅎ

 

 

그리고 싱글톤으로.. 구성되어 있습니다. 

 

addObserver해주기!!

self = viewController일 것이고.

selector는 name에 넣은 상태 발생시 실행시킬 메서드!이구..

name은 UIResponder.키보드 변화?!? willShow와 willHide입니다. 

 

 

UIResponder 예전에 firstResponder나 touch 이벤트 등에서 썼었는데.. 여러 간단한 이벤트들을 넣어논 것 같습니다.

 

UIResponder에서 시스템 키보드도 관리하는 것 같습니다.

 

NotificationCenter에서 NSNotification을 파리미터로 주는 것 같습니다. 키보드의 길이를 구해서 뷰를 변경할 것입니다.

 

실행 해볼까요!!

 

파리미터로 받아오는 NSNotification이 궁금해서 print 해봤습니다.

 

 

keyboard에 관한 notification이어서 keyboard정보와 파라미터로 name을 썻던.. 그 name이 나오네요.

애니메이션 관련 변수도 있습니다. 아 그래서 키보드나 textField가 애니메이션처럼 움직이는게 보이는건가...

 

키보드 길이 구하는 방법

NSRect로 되어있는 FrameEndUserInfokey를 NSValue로 바꾸고 CGRect로 바꾸고.. height를 추출합니다...

(뭐이리 타입형을 많이 바꿔....)

 

생각

- removeObserver를 꼭 해줘야 하나...?싱글톤이라서 메모리에 계속 있게 되서 해줘야 한다곤 하는데;;?!

- name을 이용해서 함수를 하나로 해서 name별로 다르게 동작해도 될 것같습니다.

- 시스템 키보드는 UIResponder, notification object이고 그를 감시하는 notificationCenter의 옵저버랄까...?! 뭔소리;