窥视和弹出不会仅在最后一个单元格上触发

时间:2019-01-18 20:04:47

标签: ios swift 3dtouch ios-extensions peek-pop

我有一个包含列表的ProfileVC。 我可以单击任何将显示窥视和弹出功能的行单元格。

ProfileVC.swift

我添加了扩展范围

extension ProfileViewController : UIViewControllerPreviewingDelegate {

    func detailViewController(for indexPath: IndexPath) -> ProfileDetailViewController {
        guard let vc = storyboard?.instantiateViewController(withIdentifier: "ProfileDetailViewController") as? ProfileDetailViewController else {
            fatalError("Couldn't load detail view controller")
        }

        let cell = profileTableView.cellForRow(at: indexPath) as! ProfileTableViewCell

        // Pass over a reference to the next VC
        vc.title   = cell.profileName?.text
        vc.cpe     = loginAccount.cpe
        vc.profile = loginAccount.cpeProfiles[indexPath.row - 1]

        consoleLog(indexPath.row - 1)

        //print("3D Touch Detected !!!",vc)

        return vc
    }

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        if let indexPath = profileTableView.indexPathForRow(at: location) {

            // Enable blurring of other UI elements, and a zoom in animation while peeking.
            previewingContext.sourceRect = profileTableView.rectForRow(at: indexPath)

            return detailViewController(for: indexPath)
        }

        return nil
    }

    //ViewControllerToCommit
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {

        // Push the configured view controller onto the navigation stack.
        navigationController?.pushViewController(viewControllerToCommit, animated: true)
    }

}

然后,在我注册的viewDidLoad()的同一文件 ProfileVC.swift

if (self.traitCollection.forceTouchCapability == .available){
    print("-------->", "Force Touch is Available")
    registerForPreviewing(with: self, sourceView: view)
}
else{
    print("-------->", "Force Touch is NOT Available")
}

结果

我不知道为什么无法单击第4 个单元格。

该行的最后单元格不会触发“窥视与弹出”。

人们将如何进行进一步的调试?

1 个答案:

答案 0 :(得分:1)

您正在将视图控制器的根view注册为peek上下文的源视图。结果,传递给previewingContext(_ viewControllerForLocation :)的CGPoint在该视图的坐标空间中。

当您尝试从表视图中检索相应的行时,该点实际上将根据表视图在根视图中的相对位置而偏离表视图frame中的相应点。

此偏移量表示无法为表的最后一行检索对应的行; indexPathForRow(at:)返回nil,并且您的函数不执行任何操作而返回。

您还可能会发现,如果强行触摸单元格的底部,则实际上可以看到下一行。

您可以将CGPoint转换为表格视图的框架,但是在注册预览时只需将表格视图指定为源视图会更简单:

if (self.traitCollection.forceTouchCapability == .available){
    print("-------->", "Force Touch is Available")
    registerForPreviewing(with: self, sourceView: self.profileTableView)
}
else{
    print("-------->", "Force Touch is NOT Available")
}