2014년 1월 17일 금요일

[iOS] Keyboard가 표시될 때, Toolbar의 위치 이동하기.

 키보드가 표시될 때, 발생하는 이벤트를 받아오는 방법은 블로그 ([iOS] Keyboard가 표시될 때, 사라질 때 이벤트와 그 키보드의 위치는?)를 참고하시면 됩니다.
 이번에는 아래에 표시되는 toolbar를 키보드가 표시되는 Animation에 맞춰서 위로 이동하고, 아래로 이동하도록 정리합니다.

1. 관련한 정보는 어디에서 가져오나요?

keyboard가 표시될 경우, NSNotification 객체에 정보를 담아서 전달이 됩니다. 이 notification에서 해당 정보를 찾아서 가져오면 됩니다.

2. 어떤 정보가 필요할 까요?

Toolbar에 위치를 이동시키는데, 이동 시간과, 애니메이션 방법, 위치가 필요합니다.
키보드가 나타나는 시간동안 어떤 형태로 애니메이션으로 어디에 표시되는지를 알면, 그와 같은 방식으로 이동하면 같이 붙어서 이동하는 것처럼 표시가 됩니다.
source code
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardFrame;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];

키보드가 표시될 때, 사라질 때, Toolbar에 대한 Animation을 아래 소스와 같이 설정해 두면 됩니다.

3. 소스

source code
#pragma mark - Toolbar animation helpers

// Helper method for moving the toolbar frame based on user action
- (void)moveToolBarUp:(BOOL)up 
forKeyboardNotification:(NSNotification *)notification
{
    NSDictionary *userInfo = [notification userInfo];
    
    // Get animation info from userInfo
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;
    CGRect keyboardFrame;
    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] 
                                      getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] 
                                      getValue:&animationDuration];
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] 
                                      getValue:&keyboardFrame];
    
    // Animate up or down
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];
    
    UIToolbar *toolbar = self.navigationController.toolbar;
    [toolbar setFrame:CGRectMake(toolbar.frame.origin.x,
                                 toolbar.frame.origin.y + 
        (keyboardFrame.size.height * (up ? -1 : 1)), toolbar.frame.size.width, toolbar.frame.size.height)];
    [UIView commitAnimations];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    // move the toolbar frame up as keyboard animates into view
    [self moveToolBarUp:YES 
forKeyboardNotification:notification];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    // move the toolbar frame down as keyboard animates into view
    [self moveToolBarUp:NO 
forKeyboardNotification:notification];
}


4. 결과 화면,