我有一个相当高的 UITableViewCell,上面有很多标签和按钮,我只希望标签/按钮未覆盖的某个区域(大约右上角)成为触发单元格选择状态的东西(那里会有一个复选框,用户会很清楚)。我想使用默认的 UITableViewCell 选择,因为它处理 subview 的背景等,因为我需要单元格的点击状态以将整个单元格显示为浅蓝色。
我尝试在我的标签和按钮后面放置一个没有任何作用的大按钮来“掩盖”一个区域,这在您实际点击按钮本身的某些地方有效,但是如果您点击一个标签在它后面的按钮,单元格仍然会消耗该点击并且单元格会突出显示。奇怪的是,水龙头没有转到中间的按钮。
如何拦截点击并确保只有在特定区域内表格 View 才会获得该点击并触发单元格突出显示?
Best Answer-推荐答案 strong>
听起来您想避免在用户点击单元格中的某些 View 时调用 [UITableViewDelegate tableView:didSelectRowAtIndexPath:] 。我建议通过在 UITableViewCell 子类中覆盖 [UIView hitTest:withEvent:] 来实现。
[UIView hitTest:withEvent:] 的默认返回值定义如下
The view object that is the farthest descendent the current view and contains point. Returns nil if the point lies completely outside the receiver’s view hierarchy.
所以通过覆盖它并返回一个备用 UIView 实例(您的 subview 的一个实例)而不是 UITableViewCell 实例,我们可以让 TableViewController 相信您已启动除了 UITableViewCell 实例之外的其他东西。
一个例子如下(我对 Swift 的了解非常有限。我的应用程序。):
- (UIView *)hitTestCGPoint)point withEventUIEvent *)event {
// suppose you put all your subviews in contentView
for (UIView *subview in self.contentView.subViews) {
// translates the point relative to the subviews coordinate system.
CGPoint convertedPoint = [self convertPoint:point toView:subview];
// returns the subview instance if the touch happens inside the subview.
if (CGRectContainsPoint(subview.bounds, convertedPoint)) {
return subview;
}
}
// call the super's implementation if you find the touch didn't hit any sub view
return [super hitTest:point withEvent:event];
}
关于ios - 仅使 UITableViewCell 触发单元格选择的特定区域,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/46255024/
|