0

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

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

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

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

谢谢你的想法

艾通克·伊塞文

4

2 回答 2

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
}

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

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


将 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来生成这个函数,但我认为在这种情况下没有必要。

于 2012-05-25T14:33:59.580 回答
1

诀窍是让您的 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;
    }
于 2014-07-10T01:11:44.130 回答