1

iPhoneアプリには、標準のキーボードと同じように機能するカスタムキーボードがあります。カスタムテキストフィールドがファーストレスポンダーになると表示され、フィールドがファーストレスポンダーを辞任すると非表示になります。次のように、Genericとその非表示の対応物も投稿しUIKeyboardWillShowNotificationUIKeyboardDidShowNotificationいます。

NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:5];
[userInfo setObject:[NSValue valueWithCGPoint:self.center]
             forKey:UIKeyboardCenterBeginUserInfoKey];
[userInfo setObject:[NSValue valueWithCGPoint:shownCenter]
             forKey:UIKeyboardCenterEndUserInfoKey];
[userInfo setObject:[NSValue valueWithCGRect:self.bounds]
             forKey:UIKeyboardBoundsUserInfoKey];
[userInfo setObject:[NSNumber numberWithInt:UIViewAnimationCurveEaseOut]
             forKey:UIKeyboardAnimationCurveUserInfoKey];
[userInfo setObject:[NSNumber numberWithDouble:thisAnimDuration]
             forKey:UIKeyboardAnimationDurationUserInfoKey];

[[NSNotificationCenter defaultCenter] postNotificationName:UIKeyboardWillShowNotification
                                                    object:nil
                                                  userInfo:userInfo];

UIViewControllerこのコードは機能しており、サブクラスで使用しています。

iPhone OS 3.0以降、UITableViewControllerシステムキーボードが表示および非表示になると、tableViewのサイズが自動的に変更されます。私は今3.0に対してコンパイルしているだけで、同じ通知を投稿しているので、カスタムキーボードが表示された場合、コントローラーもテーブルのサイズを変更する必要があると思いました。しかし、そうではありません。テーブルビューコントローラは、入力フィールドのデリゲートとして設定されます。

なぜこれが当てはまるのか誰かが知っていますか?誰かが同様の何かをうまく実装しましたか?

カスタム入力フィールドに沿って標準の入力フィールドがあるので、ユーザーがフィールドを変更すると、標準キーボードが非表示になり、カスタムキーボードが表示されます。tableViewのサイズをフルハイトに変更せず、カスタムメソッドを使用してサイズを変更し直す必要がない場合は便利です。

4

2 に答える 2

0

さて、あなたが突っ込んだいくつかの可能性があります。あなたの説明から、UITableViewはUIKeyboard通知を使​​用していないようです。

しかし、おそらく、この通知(またはUITabBarController)に応答しているのはUINavigationControllerです。

テーブルビューのsetFrame:drawRect:やsetNeedsDisplayなどのメソッドをオーバーライドして、呼び出しスタックで何が起こっているかを確認できます。テーブルビューが正しいサイズで再描画される原因を実際に把握できる場合があります。

しかし、おそらく、tableViewのサイズを自分で変更するだけの方がはるかに簡単な解決策です。これらの提案はただの楽しみです!

于 2010-03-21T01:20:17.977 に答える
0

私は似たようなことをしました。思い出すと、送信した通知またはシステムが送信した通知にTableViewControllerをサブエシブし、テーブルビューのフレームへの変更をアニメーション化することになりました。おそらく内部で同様のことをしていると思いますが、最終結果は、システムが通知を投稿しているときに両方が実行される2つのアニメーションブロックが互いにラップされたものになると思いますが、最終結果は同じである必要があります。

viewdidLoadで:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardWillShow:) 
                                             name: UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardDidShowOrHide:) 
                                             name: UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardWillHide:) 
                                             name: UIKeyboardWillHidewNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(keyboardDidShowOrHide:) 
                                             name: UIKeyboardDidHideNotification object:nil];

およびViewControllerの場合:

-(void) keyboardWillShow:(id)sender {
  [UIView beginAnimations];
  [UIView setAnimationDuration:0.3];
  self.view.frame = //Your new size
}

-(void) keyboardDidShowOrHide:(id)sender {
  [UIView commitAnimations];
}

-(void) keyboardWillHide:(id)sender {
  [UIView beginAnimations];
  [UIView setAnimationDuration:0.3];
  self.view.frame = //Your old size
}
于 2010-03-20T01:27:47.060 に答える