7

UISearchBarから呼び出されたキーボードにaccessoryViewを追加したいと思います。UISearchBarはこのプロパティを実装していないため、toolBarを作成しました。この件に関するAppleのドキュメントに従って、私は通知センターを使用して、キーボードがいつ呼び出されたかを知るだけでなく、向きによって変わるキーボードのサイズも知ることにしました。

ドキュメントの例に従い、keyboardWasShownメソッドで、キーボードの上部にツールバーを表示するアニメーションを呼び出します。このようなもの:

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

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

     NSLog(@"width: %.1f; height: %.1f", keyboardSize.width, keyboardSize.height );

    [self showAccessoryView:keyboardSize.height];
}

そして、アニメーションでは、ツールバーのフレームを次のように設定しました。

 self.auxiliaryKeyboardBar.frame=CGRectMake(0, self.view.frame.size.height-(44+kbh), self.view.frame.size.width, 44);

ここで、44はツールバーの静的な高さであり、kbhは上記のメソッドから渡されたkeyboard.size.heigthです。

私が観察している問題は、userInfo辞書で指定されたキーボードのサイズが常に縦向きを参照していることです。したがって、縦向きのNSLogは次のとおりです。

width: 320.0; heigth: 216.0、大丈夫です

しかし、向きを横向きに変更してキーボードを呼び出すと、NSLogは次のようになります。

width: 162.0; heigth: 480.0、ツールバーをスコープ外にします。

そのため、アニメーションを呼び出す前に、次のような条件を追加することになりました。

if ([self deviceIsPortrait]==YES) {
        [self showAccessoryView:keyboardSize.height];
    }else if ([self deviceIsPortrait]==NO) {
        [self showAccessoryView:keyboardSize.width];
    }

キーボードの高さ(フロートとして)への依存を避けるためにAppleの例に正確に従っているので、何か間違ったことをしているのかどうか疑問に思っています。とにかく条件付きの向きを追加する必要がありました。

何が起きてる?

4

1 に答える 1

25

私はあなたが欠けているのはこれだと思います:

CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window];

これは少し文脈から外れているので、完全な実装は次のとおりです。

- (void) keyboardDidShow:(NSNotification*)notification {
    CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    NSLog(@"keyboard frame raw %@", NSStringFromCGRect(keyboardFrame));

    UIWindow *window = [[[UIApplication sharedApplication] windows]objectAtIndex:0];
    UIView *mainSubviewOfWindow = window.rootViewController.view;
    CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window];
    NSLog(@"keyboard frame converted %@", NSStringFromCGRect(keyboardFrameConverted));
}
于 2012-07-02T18:28:52.403 に答える