Ios 仅生成UITableViewCell触发单元格选择的特定区域
我有一个相当高的UITableViewCell,上面有很多标签和按钮,我只希望标签/按钮没有覆盖的某个区域(大约是右上角)成为触发单元格选择状态的对象(那里会有一个复选框,用户会非常清楚)。我想使用默认的Ios 仅生成UITableViewCell触发单元格选择的特定区域,ios,uitableview,cocoa-touch,Ios,Uitableview,Cocoa Touch,我有一个相当高的UITableViewCell,上面有很多标签和按钮,我只希望标签/按钮没有覆盖的某个区域(大约是右上角)成为触发单元格选择状态的对象(那里会有一个复选框,用户会非常清楚)。我想使用默认的UITableViewCell选择,因为它处理子视图的背景等,因为我需要单元格的点击状态将整个单元格显示为浅蓝色 我试着在我的标签和按钮后面放一个大按钮来“屏蔽”一个区域,这在一些地方是有效的,你实际上是在点击按钮本身,但是如果你点击一个标签,按钮后面有一个按钮,细胞仍然会消耗这个点击,细胞会高
UITableViewCell
选择,因为它处理子视图的背景等,因为我需要单元格的点击状态将整个单元格显示为浅蓝色
我试着在我的标签和按钮后面放一个大按钮来“屏蔽”一个区域,这在一些地方是有效的,你实际上是在点击按钮本身,但是如果你点击一个标签,按钮后面有一个按钮,细胞仍然会消耗这个点击,细胞会高亮显示。奇怪的是,水龙头没有按到中间的按钮上
我如何拦截点击并确保只有在特定区域内表视图才能获得该点击并触发单元格高亮显示?如果在需要选择操作的部分使用
ui按钮,并在单元格中添加此实现,则必须根据需要进行选择操作
示例代码
import UIKit
class OnlySelectablePartTableViewCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
//Action linked to the button for valid selection part of your cell
@IBAction func selectionAction(_ sender: Any) {
self.selectionStyle = .blue
self.setSelected(!self.isSelected, animated: true)
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if(!selected)
{
self.selectionStyle = .none
}
// Configure the view for the selected state
}
}
听起来您想避免在用户点击单元格中的某些视图时调用[UITableViewDelegate tableView:DidSelectRowatineXpath:
。我建议通过覆盖UITableViewCell
子类中的[UIView-hitTest:withEvent:][/code>来实现这一点。
[UIView hitTest:withEvent:][/code>的默认返回值定义如下
当前视图最远的子视图对象,包含点。如果点完全位于接收器的视图层次之外,则返回nil
因此,通过覆盖它并返回一个备用的UIView
实例(您的子视图的实例)而不是UITableViewCell
实例,我们可以让TableViewController相信您在做UITableViewCell
实例之外的事情
下面是一个例子(我对Swift的了解非常有限。我的应用程序):
您是否尝试过使用selection=.none并自己处理单元格中的选择?@ReinierMelian是的,但是如上所述,我需要使用表格视图的默认选择,它迭代所有子视图,将标签背景设置为清除等,以便您可以看到单元格的选择视图。请检查我的答案,测试一下,让我知道@Sencha@ReinierMelian有趣的方法,我会测试出来,祈祷好运-谢谢@Sencha你最终测试了我的答案吗?请提供一些反馈
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
// suppose you put all your subviews in contentView
for (UIView *subview in self.contentView) {
// 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];
}