【问题标题】:How to use UISearchBar as input accessory view?如何使用 UISearchBar 作为输入附件视图?
【发布时间】:2023-03-18 12:45:02
【问题描述】:

我正在尝试使用 UISearchBar 作为输入附件视图,以便它可以与键盘一起动画呈现,我的第一个解决方案是,

  1. 创建一个新类 MySearchBar,它扩展 UISearchBar 并实现 UIResponder 的 inputAccessoryView 属性。
  2. 在我的视图控制器中,我创建了一个名为 mySearchBar 的新 MySearchBar 实例,并将其 inputAccessoryView 设置为自身(这会创建循环引用,但我有代码可以打破它)。
  3. 每次我想展示搜索栏时,我首先将它添加到控制器的视图中,然后调用它的 becomeFirstResponser 方法。
  4. 键盘出现后,调用 [[mySearchBar inputAccessoryView] becomeFirstResponser]。

这在装有 iOS 4.3 的 iPhone 4 上运行良好。但是,在 iPhone 5.0 模拟器上,只有在我点击搜索栏后才会显示键盘(见下图)。

然后我尝试我的第二个解决方案,

  1. 创建一个名为 MyTextField 的新类,它扩展 UITextField,在实现中创建一个 UISearchBar 并将其用作 MyTextField 的输入附件视图。
  2. 在我的视图控制器类中,我将一个虚拟 MyTextField 添加到视图层次结构中。
  3. 每次我想显示搜索栏时,我只需调用 [myTextField becomeFirstResponser]。
  4. 键盘出现后,调用 [[myTextField inputAccessoryView] becomeFirstResponser]。

使用此解决方案,我可以毫无问题地显示键盘,并专注于输入附件视图(搜索栏),但是,当搜索栏被聚焦时,我无法输入任何文本。

有人知道怎么回事吗? 谢谢!

【问题讨论】:

    标签: iphone objective-c ios uisearchbar


    【解决方案1】:

    我在将 UISearchBar 设置为自己的输入附件视图时遇到了类似的问题。第一次点击 - 栏会移动,第二次点击 - 键盘显示。关闭键盘完全从屏幕上移除了该栏。我的解决方案是手动响应键盘显示和隐藏通知,并取消输入附件。然后我会相应地为栏设置动画。如果您的搜索栏不在底部,就像我的一样,您将不得不根据您的需要定制动画。我希望这是有帮助的!

    在 viewDidLoad 中:

    [[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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2013-11-25
      相关资源
      最近更新 更多