我正在构建一个iPad应用程序。我正在尝试将UISearchBar实现为一种视图,如果用户点击它之外就会自我解脱。
点击“搜索”按钮后,我会创建一个搜索栏并将其设置为我的表格视图上方的位置。我还创建了一个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个触摸......类似的方法,我也重新实现了重置以调用它的超类。
唉,所有这些技巧都有效,除了将搜索栏传递到其框架内的水龙头。点击取消按钮不会执行任何操作。点击“清除”按钮不会执行任何操作。有人能告诉我怎么做吗?
由于