28

定数についてUIKeyboardFrameEndUserInfoKeyは、Apple docs で次のように述べています。

これらの座標は、インターフェイスの向きが変化した結果としてウィンドウの内容に適用される回転係数を考慮していません。したがって、四角形を使用する前に、(convertRect:fromWindow: メソッドを使用して) ウィンドウ座標に変換するか、(convertRect:fromView: メソッドを使用して) ビュー座標に変換する必要がある場合があります。

だから私が使用する場合[view1 convertRect:rect fromView:view2]

回転値を正しく変換するには、上記のパラメーターに何を挿入しますか? すなわち:

ビュー1 = ? 直角 = ? (私が想定しているキーボードフレーム) view2 = ?

いろいろ試して面白いものを手に入れました。

4

3 に答える 3

69

最初のビューはあなたのビューでなければなりません。2 番目のビューは、ウィンドウ/スクリーン座標を意味する nil にする必要があります。したがって:

NSDictionary* d = [notification userInfo];
CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue];
r = [myView convertRect:r fromView:nil];

これで、ビューに関して、キーボードが占有する四角形ができました。ビューが現在のビュー コントローラーのビュー (またはそのサブビュー) である場合、回転などが考慮されるようになりました。

于 2013-03-22T03:05:45.913 に答える
1
+ (void)parseKeyboardNotification:(NSNotification *)notification
                 inRelationToView:(UIView *)view
                             info:(void(^)(NSTimeInterval keyboardAnimationDuration, CGRect keyboardFrameInView, UIViewAnimationOptions keyboardAnimationOptions))callback
{
    NSParameterAssert(notification != nil);
    NSParameterAssert(view != nil);

    NSDictionary *userInfo = [notification userInfo];

    UIViewAnimationCurve animationCurve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];
    UIViewAnimationOptions animationOption = animationCurve << 16; // https://devforums.apple.com/message/878410#878410
    NSTimeInterval animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    // http://stackoverflow.com/a/16615391/202451
    CGRect screenRect    = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect windowRect    = [view.window convertRect:screenRect fromWindow:nil];
    CGRect viewRect      = [view        convertRect:windowRect fromView:nil];

    callback(animationDuration, viewRect, animationOption);
}

こんな風に使える

- (void)keyboardWillShowOrHide:(NSNotification *)notification
{    
    [AGKeyboardInfo parseKeyboardNotification:notification inRelationToView:self.view info:^(NSTimeInterval keyboardAnimationDuration, CGRect keyboardFrameInView, UIViewAnimationOptions keyboardAnimationOptions) {

        [UIView animateWithDuration:keyboardAnimationDuration delay:0 options:keyboardAnimationOptions animations:^{

             // do any modifications to your views

        } completion:nil];
    }];
}
于 2014-01-22T13:31:20.143 に答える