[iOS] 키보드의 크기 구하기

iOS 앱을 디자인할 때, 텍스트 뷰나 텍스트 필드가 화면의 아래쪽에 위치한다면, 이를 탭했을 때 키보드가 올라오면서 정작 입력된 내용이 들어있는 부분을 가려버리게 된다. 따라서 키보드가 올라올 때 텍스트 뷰의 크기나 위치를 변경할 필요가 있다.

키보드가 올라오는 부분은 텍스트 필드/ 텍스트 뷰의 경우에는 didBeginEditing 등의 메소드를 사용할 수도 있지만, 보다 확실하게는 키보드가 나타날 때 발송되는 notification 메시지를 받는 것이 일반적이다. notification 메시지에는 userinfo 사전이 있고 여기에 여러 정보들이 있는데, 우리가 알고 싶은 키보드의 크기도 이 속에 있다.  키보드의 크기는 userInfo 딕셔너리 내의 UIKeyboardFrameBeginUserInfoKey에서 구할 수 있다.

먼저 해당 뷰 컨트롤러가 로드될 때, 키보드에 대한 알림을 받도록 한다. 키보드가 나올 때 알림을 받고 싶다면 NSNotificationCenter에 자신을 옵저버로 등록한다.

-(void)viewDidLaod
{
    ...
        [[NSNotificationCenter defaultCenter]
        addObserver:self
        selector:@selector(keyboardMoved:)
        name:UIKeyboardDidShownNotification
        object:nil];
}

UIKeyboardHadShownNotification 알림은 키보드가 나타났을 때 발송된다. 이 알림을 수신하면 selector에서 지정한 메소드(keyboardMoved:)가 호출된다. 물론 이 메서드는 여기에서 추가해 줘야 한다.

이 메소드는 알림 객체를 받게 되고, 이 알림 객체 속에는 우리가 필요로 하는 정보들이 들어있다. userInfo 프로퍼티를 사용하여 키보드의 프레임을 구한다.

-(void)keyboardMoved:(NSNotification *)notification
{
    if(notification.name = UIKeyboardDidShownNotification) {
        CGRect keyboardFrame = [[notification.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] rectValue];
        // <# keyboardFrame 으로부터 키보드의 높이를 구해서 뷰의 크기를 조정 #>
        ....
    }
}

이 때 주의할 것은, 아이폰이 가로 모드일 때에도 키보드의 높이와 폭은 항상 “세로기준”으로 나타난다는 것이다. 즉, 가로 모드에서 키보드가 열리면 키보드 프레임의 height 값은 우리가보는 방향의 높이가 아닌 세로 기준에서의 높이, 즉 480 값을 갖는다.

따라서 텍스트뷰의 자동 조정이 가로모드에서도 정확하게 동작하려면 현재 아이폰이 세로 상태인지, 가로상태인지를 파악해야 한다. 이는 UIViewController의  userInterfaceOrientation 속성에서 구할 수 있다.

또한 NSNotificationCenter에 옵저버를 등록하였으므로, 뷰가 해제될 때, 이렇게 알림을 받도록 옵저버를 등록한 후에는 뷰를 제거할 때 반드시 해제를 해줘야 한다.

-(void)viewDidUnload
{
    ...
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    ...
}