如何实现一个搜索栏,当用户点击它时,它会自动解散

时间:2012-10-30 23:46:21

标签: ipad uigesturerecognizer uisearchbar

我正在构建一个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个触摸......类似的方法,我也重新实现了重置以调用它的超类。

唉,所有这些技巧都有效,除了将搜索栏传递到其框架内的水龙头。点击取消按钮不会执行任何操作。点击“清除”按钮不会执行任何操作。

有人能告诉我怎么做吗?

由于

0 个答案:

没有答案