我正在构建一个 iPad 应用程序。我正在尝试将 UISearchBar 实现为一个视图,如果用户在它之外点击它就会自行关闭。
当点击 Search 按钮时,我会创建一个搜索栏并将其动画到我的表格视图上方的位置。我还创建了一个 UITapGestureRecognizer 子类(我稍后会解释)并将其添加到应用程序的窗口中:
- (void) searchTap:(id)sender
{
if (!self.controller.filterBar)
{
_filterBarStartFrame = CGRectMake(0.0, 44.0, 320.0, 0.0);
CGRect filterBarEndFrame = CGRectMake(0.0, 0.0, 320.0, 44.0);
_tableViewStartFrame = self.controller.tableView.frame;
CGRect tableViewEndFrame = CGRectMake(self.controller.tableView.frame.origin.x, self.controller.tableView.frame.origin.y + 44.0, self.controller.tableView.frame.size.width, self.controller.tableView.frame.size.height - 44.0);
self.controller.filterBar = [[UISearchBar alloc] initWithFrame:_filterBarStartFrame];
self.controller.filterBar.delegate = self;
[self.controller.tableView.superview addSubview:self.controller.filterBar];
[UIView animateWithDuration:0.5 animations:^{self.controller.tableView.frame = tableViewEndFrame;}];
[UIView animateWithDuration:0.5 animations:^{self.controller.filterBar.frame = filterBarEndFrame;}];
tgr = [[FFTapGestureRecognizer alloc] initWithTarget:self action:@selector(filterBarTap:)];
[[[UIApplication sharedApplication] keyWindow] addGestureRecognizer:tgr];
[self.controller.filterBar becomeFirstResponder];
}
}
显示搜索栏后,我会捕获并点击测试所有单击。如果点击在搜索栏之外,我会关闭搜索栏:
- (void) filterBarTap:(FFTapGestureRecognizer*) sender
{
if (sender.state == UIGestureRecognizerStateEnded)
{
if (![self.controller.filterBar hitTest:[sender locationInView:self.controller.filterBar] withEvent:nil])
{
//if tap is outside filter bar, close the filter bar
[self searchBarCancelButtonClicked:self.controller.filterBar];
}
else
{
//pass the tap up the responder chain
//THIS DOESN'T WORK!
[self.controller.filterBar touchesEnded:sender.touches withEvent:sender.event];
}
}
}
但是,如果点击在搜索栏中,我希望搜索栏正常处理点击。我能看到的唯一方法是将 touchesEnded 发送到搜索栏,传递触摸和事件。我没有,所以我将 UITapGestureRecognizer 子类化以在它收到 touchesEnded 时捕获两者:
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent *)event
{
self.touches = touches;
self.event = event;
[super touchesEnded:touches withEvent:event];
}
我重新实现了剩下的 3 个 touches... 方法,我也重新实现了 reset 来调用它的超类。
唉,除了将发生在其框架内的点击传递给搜索栏外,所有这些诡计都有效。点击取消按钮没有任何作用。点击清除按钮没有任何作用。
谁能告诉我我该怎么做?
谢谢