1

我正在构建一个 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 来调用它的超类。

唉,除了将发生在其框架内的点击传递给搜索栏外,所有这些诡计都有效。点击取消按钮没有任何作用。点击清除按钮没有任何作用。

谁能告诉我我该怎么做?

谢谢

4

0 回答 0