当我触摸(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坐标?
答案 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
}
}