0

UISearchBar を入力アクセサリ ビューとして使用して、キーボードと一緒に存在をアニメーション化できるようにしようとしています。私の最初の解決策は、

  1. UISearchBar を拡張し、UIResponder から inputAccessoryView プロパティを実装する新しいクラス MySearchBar を作成します。
  2. ビュー コントローラーで、mySearchBar という名前の新しい MySearchBar インスタンスを作成し、その inputAccessoryView をそれ自体に設定します(これにより循環参照が作成されますが、それを解除するコードがあります)。
  3. 検索バーを表示するたびに、まずそれをコントローラーのビューに追加し、その becomeFirstResponser メソッドを呼び出します。
  4. キーボードが表示された後、[[mySearchBar inputAccessoryView] becomeFirstResponser] を呼び出します。

これは、iOS 4.3 を搭載した iPhone 4 で非常にうまく機能します。ただし、iPhone 5.0 シミュレーターでは、検索バーをタップした後にのみキーボードが表示されません (下の画像を参照)。

次に、2 番目の解決策を試します。

  1. UITextField を拡張する MyTextField という名前の新しいクラスを作成します。実装では、UISearchBar を作成し、それを MyTextField の入力アクセサリ ビューとして使用します。
  2. ビュー コントローラー クラスで、ダミーの MyTextField をビュー階層に追加します。
  3. 検索バーを表示するたびに、[myTextField becomeFirstResponser] を呼び出すだけです。
  4. キーボードが表示された後、[[myTextField inputAccessoryView] becomeFirstResponser] を呼び出します。

このソリューションを使用すると、キーボードの表示に問題はなく、入力アクセサリ ビュー (検索バー) に集中できますが、検索バーがフォーカスされているときはテキストを入力できません。

何が問題なのか知っている人はいますか?ありがとう!

4

1 に答える 1

0

UISearchBar を独自の入力アクセサリ ビューとして設定すると、同様の問題が発生しました。最初のクリック - バーが移動し、2 回目のクリック - キーボードが表示されます。キーボードを閉じると、画面からバーが完全に削除されました。私の解決策は、キーボードの表示と非表示の通知に手動で対応し、入力アクセサリを廃止することでした。次に、それに応じてバーをアニメーション化します。私のように検索バーが一番下にない場合は、必要に応じてアニメーションを調整する必要があります。これがお役に立てば幸いです。

ビューでDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

他の方法:

- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification*)notification {    
    NSDictionary* info = [notification userInfo];
    NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval duration = 0;
    [value getValue:&duration];

    return duration;
}

-(void)keyboardWillShow:(NSNotification*)n {

    CGRect frame = CGRectMake(self.mSearchBar.frame.origin.x, self.mSearchBar.frame.origin.y - 216, self.mSearchBar.frame.size.width, self.mSearchBar.frame.size.height);

    [UIView animateWithDuration:[self keyboardAnimationDurationForNotification:n] delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
    self.mSearchBar.frame = frame;
    } completion:nil];
}

-(void)keyboardWillHide:(NSNotification*)n {
    CGRect frame = CGRectMake(self.mSearchBar.frame.origin.x, self.mSearchBar.frame.origin.y + 216, self.mSearchBar.frame.size.width, self.mSearchBar.frame.size.height);

    [UIView animateWithDuration:[self keyboardAnimationDurationForNotification:n] delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
    self.mSearchBar.frame = frame;
    } completion:nil];
}

完了したらオブザーバーを削除することをお勧めします (おそらく viewDidUnload で):

[[NSNotificationCenter defaultCenter] removeObserver:self];
于 2013-03-05T08:25:19.293 に答える