ということで、それを回避できるコードを張っておきます。UITextFieldが画面一杯に貼ってあるのが前提です。
■準備:Notificationの設定■
UIKeyboardWillShowNotificationでkeyboardWillShowを呼び出すよう設定します。
- (void)viewDidLoad
{
[super viewDidLoad];
NSNotificationCenter *center;
center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
}
■本体■
UIKeyboardWillChangeFrameっていうnotificationが別にあるんですが、willShowだけでキーボードが現れる時、英語と日本語切り替えた時、日本語キーボードで予測変換窓が現れた時に呼び出されてしまいます。良いのかそれで?ミソは、convertRectです。keyboardFrameEndから返ってくるのはwindowの座標系で、ツールバーの高さやOrientationなどが配慮されていません。ので、現在のviewの座標系に変換します。これで「キーボードのorigin.y座標=使える画面の下限座標」となりますから、これでtext fieldの高さを設定し直します。
同じViewの上でキーボードを出したり消したりする必要のある時にはUIKeyboardWillHideNotificationを使います。ノリは同じで、viewのframeを取得してその下限を元にtext fieldなどの高さを調整するだけです。
- (void)keyboardWillShow:(NSNotification*)notification
{
CGRect keyboardFrameEnd = [[notification.userInfo
objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrameEnd = [self.view convertRect:keyboardFrameEnd
fromView:self.view.window];
originFrame = self.textInput.frame;
float newHeight = keyboardFrameEnd.origin.y - originFrame.origin.y;
[self.textInput setFrame:CGRectMake(originFrame.origin.x,
originFrame.origin.y,
originFrame.size.width,
newHeight)];
}
■後始末■
最後にnotificationを消し忘れないように。私はよく忘れます。ではでは。
- (void)dealloc {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center removeObserver:self
name:UIKeyboardWillShowNotification
object:nil];
[textInput release];
[super dealloc];
}
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。