仅使UITableViewCell的特定区域触发单元格选择

时间:2017-09-16 14:35:31

标签: ios uitableview cocoa-touch

我有一个相当高的UITableViewCell,上面有很多标签和按钮,我只想要标签/按钮(大致在右上角四分之一处)没有覆盖的某个区域是触发单元格选择状态的东西(那里会有一个复选框,对用户来说非常清楚)。我想使用默认的UITableViewCell选择,因为它处理子视图的背景等,因为我需要单元格的tap状态将整个单元格显示为浅蓝色。

我试过在我的标签和按钮后面放一个大按钮来“掩盖”一个区域,这可以在你实际点击按钮本身的某些地方工作,但如果你点击一个标签,它后面的按钮,单元格仍然消耗该点击并且单元格突出显示。点击不会奇怪地进入中间的按钮。

如何截取水龙头并确保只有在某个区域内,水表才能获得该水龙头并触发小区突出显示?

2 个答案:

答案 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
    }

}