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; }