2016-12-26 118 views
0

我正在尝试使用3D Touch,除了下面的功能,一切都很好,当滚动时我无法获得正确的值indexPathindexPathForRow(at: location)。此功能不能说用户是否滚动表格,并且始终将用户在应用中可以看到的第一行设置为第一行。indexPathForRow不会返回正确的值

我的代码:

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { 

     guard let indexPath = workoutTable?.indexPathForRow(at: location) else {return nil } 
     guard let cell = workoutTable?.cellForRow(at: indexPath) else {return nil } 
     guard let workoutDetailPeek = storyboard?.instantiateViewController(withIdentifier: "WorkoutDetailPeek") as? WorkoutDetailPeek else {print("else31"); return nil } 

     workoutDetailPeek.workoutId = "\(Int(workout[(indexPath as NSIndexPath).row].workoutId)!-2)" 
     workoutDetailPeek.preferredContentSize = CGSize(width: 400.0, height: 267.0) 
     previewingContext.sourceRect = cell.frame 
     return workoutDetailPeek 
} 

我一直通过不同的3D触控实现,但这个功能似乎每个人都工作正常,除了我。

回答

0

在iOS中,每个视图都有2个坐标系,它是自己的,它是超级视图。视图的坐标系几乎总是在视图的左上方有0,0。这个点很可能在超视图的坐标系中是0,0以外的地方。

当你得到一个点时,你需要知道它表达的是谁的坐标系。UIView中有各种方法可以在坐标系之间转换点。

为了让您的代码正常工作,您需要知道哪个视图的坐标系被表达。由于您在表视图中搜索单元格,因此使用表视图的坐标系是合理的选择。

我还没有开发3D触摸设备,所以我不熟悉你正在使用的功能。这个点来自你传递给它的点,它表示的坐标系是什么?