我有一个相当高的UITableViewCell,上面有很多标签和按钮,我只想要标签/按钮(大致在右上角四分之一处)没有覆盖的某个区域是触发单元格选择状态的东西(那里会有一个复选框,对用户来说非常清楚)。我想使用默认的UITableViewCell
选择,因为它处理子视图的背景等,因为我需要单元格的tap状态将整个单元格显示为浅蓝色。
我试过在我的标签和按钮后面放一个大按钮来“掩盖”一个区域,这可以在你实际点击按钮本身的某些地方工作,但如果你点击一个标签,它后面的按钮,单元格仍然消耗该点击并且单元格突出显示。点击不会奇怪地进入中间的按钮。
如何截取水龙头并确保只有在某个区域内,水表才能获得该水龙头并触发小区突出显示?
答案 0 :(得分:2)
当用户点击您单元格中的某些视图时,您希望避免调用[UITableViewDelegate tableView:didSelectRowAtIndexPath:]
。我建议通过覆盖[UIView hitTest:withEvent:]
子类中的UITableViewCell
来实现这一目标。
[UIView hitTest:withEvent:]
的默认返回值定义如下
视图对象是当前视图最远的后代并包含点。如果该点完全位于接收者的视图层次结构之外,则返回nil。
所以通过覆盖它并返回一个替代的UIView
实例(子视图的实例)而不是UITableViewCell
实例,我们可以让TableViewController相信你的其他东西除了UITableViewCell
实例。
一个例子如下(我对Swift的知识非常有限。我的applogies。):
- (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];
}
答案 1 :(得分:0)
如果您在需要执行选择操作的部分中使用UIButton
,则在您的单元格中添加此实现必须按您的需要工作
示例代码
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
}
}