【问题标题】:How can I tell when the user taps or drags a control without breaking the control?如何在不破坏控件的情况下判断用户何时点击或拖动控件?
【发布时间】:2013-01-24 15:59:28
【问题描述】:

这是我的情况:导航控制器中有一个 UISearchBar 和一个 UITableView。当用户在搜索栏中点击时,键盘会弹出以便用户可以键入搜索字符串,如下所示:

但是键盘遮住了列表,所以我想这样做,如果用户点击表格,键盘就会消失,我遇到了惊人的困难。

  1. 如果我使用 TapGestureRecognizer,我可以判断用户是否在任何地方点击,但是当他们点击桌子时,正常的桌子事件不起作用。
  2. 我尝试了其他方法(现在不记得是什么了),如果用户点击表格,我得到了事件,但没有点击和拖动,这很常见,所以这还不够。

我想要的是类似于表格本身的 TouchDownInside 事件,因此当表格获得任何类型的用户输入时,我可以关闭键盘,但这似乎不存在。最好的方法是什么?

【问题讨论】:

    标签: iphone ios xamarin.ios


    【解决方案1】:

    一个简单的解决方案是在 UITableView 滚动时捕获,因为 UITableView 扩展了 UIScrollView,您可以查找 scrollViewDidScroll: 并使搜索栏成为第一响应者以使键盘消失,同样可以这样做scrollViewWillBeginDragging: 方法

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        [searchBar resignFirstResponder];
    }
    

    在你的 UITableViewDelegate 上实现这个,因为它表现为你的 UITableView 的委托

    更多信息在

    http://developer.apple.com/library/ios/documentation/uikit/reference/uiscrollviewdelegate_protocol/

    【讨论】:

    • 这基本上是对的,但在 MonoTouch 中有一个陷阱。此事件似乎存在于 UITableViewSource 和 UITableView 中,但它从未在 UITableView 上触发,只有 UITableViewSource,因此您必须在其中挂钩事件。
    【解决方案2】:

    如果我使用 TapGestureRecognizer,我可以判断用户是否在任何地方点击,但是当他们点击桌子时,正常的桌子事件不起作用。

    您可以尝试将cancelsTouchesInView 设置为 NO,以便您的点击手势识别器:

    tapGestureRecognizer.cancelsTouchesInView = NO;
    

    这应该允许触摸被转发到视图,即使手势被识别。

    您可能还需要为手势识别器和以下方法定义一个委托:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    {
        return YES;
    }
    

    这是假设桌子也通过手势识别器管理其手势,因此允许两者可以同时工作。

    【讨论】:

    • 我刚刚尝试过,但它不起作用。它正确地将事件转发到控件,但如果我点击并拖动表格,它根本不会触发,但这不是我需要的。手势在点击和拖动时根本不会触发。
    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2011-05-18
    • 2014-08-21
    • 1970-01-01
    • 2019-05-26
    • 2021-01-06
    相关资源
    最近更新 更多