【问题标题】:how to know uitableview is pressed when empty空时如何知道uitableview被按下
【发布时间】:2012-06-01 02:29:54
【问题描述】:

我正在制作一个聊天应用程序,在聊天窗口中,uitableviewcells 中有 uilabels。最初键盘会出现,但是当用户触摸 uitableview 上的任何位置时,我会将聊天窗口设为全屏(键盘消失)。

我找不到实现此目的的方法/技巧。

我尝试了以下方法:通过使用 tableview:didselectrowatindexpath,我能够做到,但用户需要按下现有的 uitableviewcell。但即使 uitableview 为空,我也想了解媒体。

注意:我的聊天表格视图是交互式的,例如有些行将包含需要按下的图像按钮,所以我不能只在 uitableview 上放置一个不可见的按钮。

感谢您的意见

Aytunc Isseven

【问题讨论】:

    标签: ios5 uitableview uibutton uigesturerecognizer


    【解决方案1】:

    您要做的是向 UITableView 添加一个手势识别器,以响应适当的手势。我建议不要使用 UITapGestureRecognizer,因为 UITableView 已经在使用点击来选择单元格,因此您可能想尝试使用 UILongPressGestureRecognizer。我整理了一个小样本,说明如何做到这一点,如下所示:

    在我的 viewDidLoad 中,我执行了以下操作:

    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressFrom:)];
    [self.tableView addGestureRecognizer:gesture];
    

    handleLongPressFrom: 如下:

    - (void)handleLongPressFrom:(UILongPressGestureRecognizer *)recognizer {
        NSLog(@"handleLongPressFrom: %@", recognizer);
        // Add real code here
    }
    

    完整的手势列表可以在here找到。

    哦,如果您还想继续使用 tap,请查看 this 堆栈溢出问题。我不知道所介绍的方法是否完全有效,但这是一个很好的起点。


    将 UITapGestureRecognizer 与 UITableView 一起使用: 好的,由于点击手势似乎是您的用例的正确手势,您可以尝试执行以下操作。第 1 步是设置我上面列出的手势识别器,使用点击手势而不是长按手势。

    viewDidLoad 中的代码与一个重要的补充非常相似...

    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
    // we need to set the gesture delegate so we can allow the tap to pass through to the
    // UITableViewCell if necessary.
    gesture.delegate = self;
    [self.tableView addGestureRecognizer:gesture];
    

    handleTapFrom: 函数几乎相同,只是参数不同的手势识别器。

    - (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
        NSLog(@"handleTapFrom: %@", recognizer);
        // Add real code here
    }
    

    这种方法的主要变化是我们需要实现 UIGestureRecognizerDelegate 协议。由于我们的目标是允许点击手势通过 UITableView 传递到它的子视图(即 UITableViewCell 和它的组件),我们需要实现 gestureRecognizer:shouldRecieveTouch: 函数。以下实现应该涵盖您正在尝试的内容。

    #pragma mark UIGestureRecognizerDelegate methods
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        // If the view that is touched is not the view associated with this view's table view, but
        // is one of the sub-views, we should not recognize the touch.
        if (touch.view != self.tableView && [touch.view isDescendantOfView:self.tableView]) {
            return NO;
        }
        return YES;
    }
    

    isDescendantOfView: 如果它正在测试的视图与进行测试的视图相同,则函数返回 YES,因此我们需要单独适应这种情况。你可以通过使用gestureRecognizer.view而不是self.tableView来生成这个函数,但我认为在这种情况下没有必要。

    【讨论】:

    • 谢谢乍得,我不想使用长按手势,因为 iphone 用户没有这样的习惯。我需要一个水龙头。但如果我这样做,它会覆盖 uitableviewcell 水龙头吗?有没有办法区分 uitableview tapgesture 和 uitableviewcell didselectrowatindexpath?谢谢
    • 好吧,我想可能是这样。那么你想要完成的是当用户触摸键盘外部时关闭键盘?
    • 哦,如果你在 tableview 中添加了一个 Tap 手势,它确实会吃掉 UITableViewCell 的点击,但是有一个解决方法,它只是让事情变得有点复杂。
    • 我刚刚更新了我的答案,如果点击发生在 UITableViewCell ,则允许点击手势传递到 UITableViewCell 。如果这不起作用/不是您所需要的,请告诉我。
    • 我刚开始应用你的答案乍得,我会尽快提供反馈,谢谢
    【解决方案2】:

    诀窍是让您的 viewController 在视图上放置一个点击识别器,但通过从委托方法“gestureRecognizerShouldBegin”返回 NO 来使其始终选择退出。这样,每次触摸视图都会调用gestureRecognizerShouldBegin,但不会干扰表格的正常事件处理。

        - (void)viewDidLoad {
          [super viewDidLoad];
          [self detectTouchesOnView:self.tableView];
        }
    
        - (void)detectTouchesOnView:(UIView*)theView {
          UITapGestureRecognizer* tapR = [[UITapGestureRecognizer alloc]initWithTarget:nil action:nil];
          tapR.delegate = self;
          [theView addGestureRecognizer:tapR];
        }
    
        - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
           // React to the UITableView being touched E.G. by hiding the keyboard as below.
          [self.view endEditing:YES]; 
          return NO;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多