如何在选择自定义UITableViewCell时获取触摸坐标?

时间:2009-08-14 09:50:13

标签: ios iphone uitableview cocoa-touch delegates

当我触摸(Touch Up)一个UITableViewCell我的ViewController的UITableViewDelegate方法 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 被调用。此时我还需要获得Touch-Point的x坐标,以便我可以知道Cell的哪个部分被触摸(非附件物品)。我尝试使用常见的触摸方法,如TouchesDidEnd,但无论我在哪里触摸,坐标总是返回x = 0.000 y = 0.000(在我的ViewController中的UITableView对象中的自定义UITableViewCell中的位置)。我也尝试在Custom Cell类中实现触摸处理,虽然我可以获得准确的坐标,但我无法将这些坐标传递给我的ViewController类(它有UITableView)。

问:当我触摸自定义UITableViewCell时,是否有一种很好的方法可以获取设备屏幕的x坐标?

4 个答案:

答案 0 :(得分:5)

在表格视图的顶部放置一个透明的UIView,覆盖其-touchesBegan:withEvent:等方法。在这些被覆盖的方法中,获取UITouch个对象并在其上调用-locationInView:以获取CGPoint值。

它为您提供触摸事件的坐标。

然后,您只需将这些UITouch事件传递给基础表视图。表视图处理其通常接触行等的业务。

答案 1 :(得分:0)

怎么样:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let rect = tableView.rectForRow(at: indexPath as IndexPath)
        var point = CGPoint(x: rect.midX, y: rect.midY)
        point = tableView.convert(point, to: nil)
        print(point)
}

答案 2 :(得分:0)

1。将tapGestureRecognizer添加到tableView

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tableViewTapped(recognizer:)))
tableView.addGestureRecognizer(tapGestureRecognizer)

2。编写一个处理tapGesture的函数

@objc func tableViewTapped(recognizer: UITapGestureRecognizer) {
    let location = recognizer.location(in: self.tableView) // point of touch in tableView
    if let indexPath = self.tableView.indexPathForRow(at: location) { // indexPath of touch location
        if let cell = tableView.cellForRow(at: indexPath) as? MyCustomCell {
            let locationInCell = recognizer.location(in: cell) // point of touch in cell
            // do something with location or locationInCell

            if cell.imageView.frame.contains(location) || cell.imageView.frame.contains(locationInCell) {
                    print("ImageView inside cell tapped!")        
            }
        }
    }
}

答案 3 :(得分:0)

1)在自定义单元格中传递视图控制器对象

class ImageTableViewCell: UITableViewCell {

      @IBOutlet weak var img: UIImageView!

      var vc: UIViewController? = nil

      var delegate: TouchLocation?

}

2)使用touchesBegan方法覆盖自定义表格视图单元格,并覆盖super touchesBegan方法

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    delegate?.touchLocation(location: (touch?.location(in: self.vc?.view))!)
    if let aTouches = touches as? Set<UITouch>, let anEvent = event {
        super.touchesBegan(aTouches, with: anEvent)
    }
}

3)获取位置并使用委托传递给视图控制器

protocol TouchLocation {
   func touchLocation(location: CGPoint)
}

extension ImageListViewController: TouchLocation{

   func touchLocation(location: CGPoint) {
         self.touchedPosition = location // Here you will get touch location 
   }

}