Peek & Pop 不会仅在最后一个单元格上触发
Peek & pop does not trigger only on the last cell
我有一个包含列表的 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)
}
}
然后,在同一个文件ProfileVC.swift中viewDidLoad()
我注册了它
if (self.traitCollection.forceTouchCapability == .available){
print("-------->", "Force Touch is Available")
registerForPreviewing(with: self, sourceView: view)
}
else{
print("-------->", "Force Touch is NOT Available")
}
结果
我不知道为什么我不能点击 4th 单元格。
该行的 最后一个 单元格不会触发 Peek & Pop。
如何进一步调试它?
您正在将视图控制器的根 view
注册为 peek 上下文的源视图。结果,传递给 previewingContext(_ viewControllerForLocation:)` 的 CGPoint
位于该视图的坐标 space 中。
当您尝试从 table 视图中检索相应的行时,该点实际上会根据相对位置从 table 视图的 frame
中的相应点偏移根视图中的 table 视图。
这个偏移量意味着无法为table中的最后一行检索对应的行; indexPathForRow(at:)
returns nil
和你的函数 returns 什么都不做。
您可能还会发现,如果您用力触摸单元格的底部,您实际上会看到下一行。
您可以将 CGPoint
转换为 table 视图的框架,但在注册预览时将 table 视图指定为源视图更简单:
if (self.traitCollection.forceTouchCapability == .available){
print("-------->", "Force Touch is Available")
registerForPreviewing(with: self, sourceView: self.profileTableView)
}
else{
print("-------->", "Force Touch is NOT Available")
}
我有一个包含列表的 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)
}
}
然后,在同一个文件ProfileVC.swift中viewDidLoad()
我注册了它
if (self.traitCollection.forceTouchCapability == .available){
print("-------->", "Force Touch is Available")
registerForPreviewing(with: self, sourceView: view)
}
else{
print("-------->", "Force Touch is NOT Available")
}
结果
我不知道为什么我不能点击 4th 单元格。
该行的 最后一个 单元格不会触发 Peek & Pop。
如何进一步调试它?
您正在将视图控制器的根 view
注册为 peek 上下文的源视图。结果,传递给 previewingContext(_ viewControllerForLocation:)` 的 CGPoint
位于该视图的坐标 space 中。
当您尝试从 table 视图中检索相应的行时,该点实际上会根据相对位置从 table 视图的 frame
中的相应点偏移根视图中的 table 视图。
这个偏移量意味着无法为table中的最后一行检索对应的行; indexPathForRow(at:)
returns nil
和你的函数 returns 什么都不做。
您可能还会发现,如果您用力触摸单元格的底部,您实际上会看到下一行。
您可以将 CGPoint
转换为 table 视图的框架,但在注册预览时将 table 视图指定为源视图更简单:
if (self.traitCollection.forceTouchCapability == .available){
print("-------->", "Force Touch is Available")
registerForPreviewing(with: self, sourceView: self.profileTableView)
}
else{
print("-------->", "Force Touch is NOT Available")
}