2013年7月10日水曜日

iPhoneのキーボードが出た時にUITextFieldの高さを変える方法(iOS 6)

よく、ブログなどに書かれているのは、「出てきたキーボードの高さ分をUITextFieldのheightから引いてやる」って感じだけど…それだと英語キーボードから日本語キーボードに切り替え、さらに予測変換窓が出た時に過剰に小さくなってしまったりします。

ということで、それを回避できるコードを張っておきます。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 件のコメント:

コメントを投稿