5

キーボードが表示されたときにUITextViewのサイズを変更しようとしています。iPhoneでは美しく動作します。システムがキーボード通知をディスパッチすると、テキストビューのサイズが変更されます。編集が終わったら、最初のスペースを埋めるようにサイズを変更します。(はい、編集が停止するとキーボードがなくなったと思います。変更する必要があります。ただし、それは私の問題ではないと思います。)

iPadでテキストビューのサイズを変更すると、フレームのサイズが正しく変更されますが、アプリはフレームのY値をゼロにリセットしているようです。これが私のコードです:

- (void) keyboardDidShowWithNotification:(NSNotification *)aNotification{

//
//  If the content view being edited
//  then show shrink it to fit above the keyboard.
//

if ([self.contentTextView isFirstResponder]) {

    //
    //  Grab the keyboard size "meta data"
    //

    NSDictionary *info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    //
    //  Calculate the amount of the view that the keyboard hides.
    //
    //  Here we do some confusing math voodoo.
    //
    //  Get the bottom of the screen, subtract that 
    //  from the keyboard height, then take the 
    //  difference and set that as the bottom inset 
    //  of the content text view.
    //

    float screenHeightMinusBottom = self.contentTextView.frame.size.height + self.contentTextView.frame.origin.y;

    float heightOfBottom = self.view.frame.size.height - screenHeightMinusBottom;


    float insetAmount = kbSize.height - heightOfBottom;

    //
    //  Don't stretch the text to reach the keyboard if it's shorter.
    //

    if (insetAmount < 0) {
        return;
    }

    self.keyboardOverlapPortrait = insetAmount;

    float initialOriginX = self.contentTextView.frame.origin.x;
    float initialOriginY = self.contentTextView.frame.origin.y;

    [self.contentTextView setFrame:CGRectMake(initialOriginX, initialOriginY, self.contentTextView.frame.size.width, self.contentTextView.frame.size.height-insetAmount)];


}

なぜこれはiPhoneで機能し、iPadでは機能しないのでしょうか。また、自動サイズ変更マスクが予期しない変更を加える可能性はありますか?

4

1 に答える 1

3

@bandejapaisaが言ったように、少なくとも私のテストでは、向きが問題であることがわかりました。

まず、kbSize.height誤解を招く可能性のある使用についてです。横向きでは、キーボードの幅を表すためです。したがって、コードはにあるので、次のUIViewControllerように使用できます。

float insetAmount = (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)?kbSize.height:kbSize.width) - heightOfBottom;

self.interfaceOrientationインターフェイスの向き(デバイスの向きとは異なる場合があります)を示し、指定された向きが縦(上または下)の場合はマクロUIInterfaceOrientationIsPortraitが返されます。YESしたがって、キーボードの高さはkbSize.height、インターフェイスがポートレートのkbSize.width場合とインターフェイスがランドスケープの場合にあるため、適切な値を取得するには、向きをテストする必要があります。

しかし、それだけでは十分ではありませんself.view.frame.size.height。値に関して同じ問題を発見したからです。だから私は同じ回避策を使用しました:

float heightOfBottom = (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)?self.view.frame.size.height:self.view.frame.size.width) - screenHeightMinusBottom;

お役に立てれば...

于 2011-09-21T14:09:26.473 に答える