로그인 창을 구성할 경우에, 키보드가 나오면서 로그인 UITextField영역을 덮어 버리는 경우가 있다. 이 경우 화면설계를 할 때 하단에 키보드가 나왔을 때의 영역을 고려해서 로그인 텍스트 필드를 배치하는 경우도 있다.하지만, 임시방편일 뿐이고, 보다 근본적인 방법으로 키보드가 나올 때 해당 UIView를 위로 올렸다가 키보드가 사라질 때 그걸 내리는 방법으로 구현해야 한다.
이 방법을 좀 더 세부적으로 보면
1. UIKeyboard가 나타나는 이벤트를 감지했을 때
2. 키보드 아래쪽의 UIView영역을 키보드 높이 만큼 위로 이동시킨다.
3. 키보드 입력이 모두 끝나, 키보드 닫는 이벤트가 나왔을 때
4. 키보드를 사라지게 만드면서, UIView를 원래의 위치로 내린다.
구현을 위해서,
먼저 UIKeyboardWillShowNotification 이벤트가 발생할 때, keyboardWillShow 메소드를 호출하도록 등록한다.
- (void)loadView
{
[super loadView];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:self.view.window];
}
keyboardWillShow 메소드는 다음과 같은 형태이다.
- (void)keyboardWillShow:(NSNotification *)notif
{
// The keyboard will be shown. If the user is editing the author, adjust the display so that the
// author field will not be covered by the keyboard.
if ( [[self userIDTextField] isFirstResponder] && self.view.frame.origin.y >= 0)
{
[self setViewMovedUp:YES];
}
else if ( [[self userIDTextField] isFirstResponder] && self.view.frame.origin.y < 0)
{
[self setViewMovedUp:NO];
}
}
해당 notification이 발생했을 때 위 메소드가 실행되고,
키보드의 상태에 따라서 View를 올릴지 내릴지 애니메이션을 시켜주는 setViewMovedUp 메소드를 호출해준다.
- (void)setViewMovedUp:(BOOL)movedUp
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
// Make changes to the view's frame inside the animation block. They will be animated instead
// of taking place immediately.
CGRect rect = self.view.frame;
if (movedUp)
{
// If moving up, not only decrease the origin but increase the height so the view
// covers the entire screen behind the keyboard.
rect.origin.y -= kOFFSET_FOR_KEYBOARD;
rect.size.height += kOFFSET_FOR_KEYBOARD;
}
else
{
// If moving down, not only increase the origin but decrease the height.
rect.origin.y += kOFFSET_FOR_KEYBOARD;
rect.size.height -= kOFFSET_FOR_KEYBOARD;
}
self.view.frame = rect;
[UIView commitAnimations];
}
UIView의 애니메이션을 어떻게 시키는지 보여주는 메소드이다.
마지막으로 키보드 작업이 끝났을 때에 키보드를 내려주도록 textFieldDidEndEditing 메소드를 구현해주도록 하자.
- (void)textFieldDidEndEditing:(UITextField *)myTextField;
{
if( self.view.frame.origin.y < 0 )
{
[self setViewMovedUp:NO];
}
}
이제 키보드가 나타날 때 그 아래의 뷰도 함께 이동시킬 수 있게 되었다.
출처 : http://alanduncan.net/old/index.php?q=node/13
'개발 > iOS' 카테고리의 다른 글
[iOS] XCode gloss effect 없애기 (0) | 2012.03.24 |
---|---|
[iOS] UITableView Cell 변경 animation (0) | 2011.04.29 |
[IOS] image size (0) | 2010.11.28 |
[XCODE] Breakpoint가 안먹을 때 (0) | 2010.11.28 |
[XCODE] 메모리 관리 규칙 (0) | 2010.11.16 |