iOSプログラミングの注意点 その3 (UITextUnBlinder修正)

先日アップしたBBUITextUnBlinderだが早速バグが見つかったので修正(恥

bb_keyboardDidShow等で通知メソッドのパラメタから内部ソフトウェアキーボードの高さをCGRectとして取得しているが、キーボードの高さはデバイスの向き(Portraint/Landscape)でフィールドが違う。

デバイスの向き CGRectのフィールド
UIInterfaceOrientationPortrait height
UIInterfaceOrientationLandscapeLeft width

デバイスが横を向いている場合、高さはHeightではなくWidthなのである。

※UIInterfaceOrientationPortraitUpsideDownはキーボードの高さが正しく通知されないケースがあるので省いた。また、UIInterfaceOrientationLandscapeLeftとUIInterfaceOrientationLandscapeRightは同値として定義されている。

なので、通知されたメソッドではこれを考慮しなくてはならない。

-(void)bb_keyboardDidShow:(NSNotification*)note
{
    CGSize kbSize = [[note.userInfo
                      objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    if ( self.keyboardHeight != 0 )
    {
        [self bb_setViewMovedUpAboveKeyboard:NO keyboardHeight:self.keyboardHeight];
        self.keyboardHeight = 0;
    }
    self.keyboardHeight = (self.interfaceOrientation == UIDeviceOrientationLandscapeRight)
       ?  kbSize.width
       :  kbSize.height;
    [self bb_setViewMovedUpAboveKeyboard:YES keyboardHeight:self.keyboardHeight];
    
}
-(void)bb_keyboardWillHide:(NSNotification*)note
{
    if ( self.keyboardHeight == 0 )
    {
        CGSize kbSize = [[note.userInfo
                          objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
        self.keyboardHeight = (self.interfaceOrientation == UIDeviceOrientationLandscapeRight)
          ?  kbSize.width
          :  kbSize.height;
    }
    [self bb_setViewMovedUpAboveKeyboard:NO keyboardHeight:self.keyboardHeight];
    self.keyboardHeight = 0;
}