我正在制作聊天应用程序,在聊天窗口中,uitableviewcells中有uilabels。最初键盘将出现,但当用户触摸uitableview上的任何地方时,我会将聊天窗口设置为全屏(消失的键盘)。
我无法找到完成此任务的方法/技巧。
我尝试了以下方法:通过使用tableview:didselectrowatindexpath,我能够做到但是,用户需要按现有的uitableviewcell。但即使uitableview是空的,我也想了解媒体..
注意:我的聊天表视图是交互式e.x.有些行会包含需要按下的图像按钮,所以我不能把一个看不见的按钮放到uitableview上。
谢谢你的想法
Aytunc Isseven
答案 0 :(得分: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:function与几乎不同的手势识别器作为参数几乎相同。
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
NSLog(@"handleTapFrom: %@", recognizer);
// Add real code here
}
这种方法的主要变化是我们需要实现UIGestureRecognizerDelegate协议。由于我们的目标是允许轻击手势通过UITableView传递到它的子视图(即UITableViewCell及其组件),我们需要实现gestureRecognizer:shouldRecieveTouch:function。以下实现应涵盖您正在尝试的内容。
#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来生成此功能,但在这种情况下我并不认为这是必要的。
答案 1 :(得分:1)
诀窍是让你的viewController在视图上放置一个tap识别器,但总是通过从委托方法" 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;
}