UITableview 的滑动手势
Posted
技术标签:
【中文标题】UITableview 的滑动手势【英文标题】:Swipe gesture for UITableview 【发布时间】:2020-03-08 15:29:58 【问题描述】:我有一种感觉,答案是“你不能那样做”,但希望永存!
我的应用程序中的一个场景是 UITableView;该表代表一个月,每一行是一个月中的一天。我在表格顶部有一个小的 UIView,带有“上一个”和“下一个”按钮。在显示下个月的表格中选择下一个结果,上一个会显示上一个月。所有这些都很好。
我想做的是添加左右手势识别器以逐月移动,执行与 Prev 和 Next 按钮相同的功能。请注意,我不需要 UITableViewCell 发生任何事情。
当我在网上搜索这个时,绝大多数帖子似乎是如何处理 UITableViewCell 中的手势识别器。这对我没有帮助。
我正在使用 Objective-C 和 Xcode 11.3.1。
有什么想法吗?
提前致谢。
【问题讨论】:
【参考方案1】:你应该可以做到的。通过禁用每个单元格的交互,您应该能够将“UIGestureRecognizer”传递给 tableView。
这是一个简短的例子。抱歉,我使用了 Swift,但您可能可以了解它的要点。
添加 tableView 后,我向其中添加了这些手势识别器。
let leftGesture = UISwipeGestureRecognizer(target: self, action: #selector(leftSwiped))
leftGesture.direction = .left
tableView.addGestureRecognizer(leftGesture)
let rightGesture = UISwipeGestureRecognizer(target: self, action: #selector(rightSwiped))
rightGesture.direction = .right
tableView.addGestureRecognizer(rightGesture)
每一个调用以下函数:
@objc func leftSwiped()
print("LEFT")
@objc func rightSwiped()
print("Right")
在单元格中,我刚刚禁用了单元格的用户交互:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.isUserInteractionEnabled = false
cell.backgroundColor = .random()
return cell
当我尝试它时,在表格视图上左右滑动会在记录器中正确打印。
希望这会有所帮助, 艾伦
【讨论】:
艾伦 - 谢谢,但这仍然不适合我。为了进行测试,我制作了一个简单的应用程序,并从情节提要中添加了手势识别器,在表格中有一个单元格,并且当我向左/向右滑动时不会触发的动作。同样简单的应用程序,带有 UIView 和手势识别器和滑动功能完美。我想让这个工作,但禁用用户交互将是我的应用程序中的一个问题。当我的应用程序显示当前月份时,今天之后几天的行已经禁用了用户交互。但我需要能够选择其他行才能切换到日视图。 我需要探索更多;我发现手势识别器在我的应用程序中的不同 UITableView 上工作,但不是我问题中的那个。 在我设置的示例中,我以编程方式添加了手势并且它正在工作。如果我所做的对您有所帮助,您至少可以给我一个支持吗? Alan - 我确实给了你一个赞成票1 不幸的是,我对 SO 用户太新了,不能公开显示赞成票。谢谢!【参考方案2】:Objective C 中的答案
与@Alan 相同的答案,但无需在cellForRowAt
方法中添加以下行
cell.isUserInteractionEnabled = false
cell.backgroundColor = .random()
使用下面的方法在 TableView 中滑动手势
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UISwipeGestureRecognizer *leftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftHandler)];
[self.tableView addGestureRecognizer: leftGestureRecognizer];
UISwipeGestureRecognizer *rightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightHandler)];
[self.tableView addGestureRecognizer: leftGestureRecognizer];
-(void) swipeLeftHandler
NSLog(@"SWIPE Left");
// add same method which you call on next button’s click
-(void) swipeRightHandler
NSLog(@"SWIPE Right");
// add same method which you call on previous button’s click
【讨论】:
【参考方案3】:问题已解决。
我发现如果我以编程方式将滑动识别器添加到我的 tableview 中,识别器会按预期工作。但是如果使用情节提要添加滑动识别器,它们根本不起作用。这是我发布问题时正在测试的内容。
经过一番挖掘,我发现需要将情节提要识别器添加到我的 tableview 中的引用插座集合中。无论出于何种原因,当我最初添加它们时,这并没有发生。将识别器连接到我的 tableview 后,一切都按预期工作。
【讨论】:
以上是关于UITableview 的滑动手势的主要内容,如果未能解决你的问题,请参考以下文章