应用程序在iPhone 6s的’偷看和弹出’实现中很快

我已经在我的应用程序中实现了窥视和弹出,它完美地运行。 但是在不断尝试7-8次时,该应用程序冻结了窥视视图。 我唯一的选择是杀死应用程序并重新运行。 请让我知道冻结的原因。 我在我的项目中使用了以下代码来查看和弹出:

var isPresentedBy3Dtouch: Bool = false var passedDetails:DetailModel! func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { guard let indexPath = tableView?.indexPathForRowAtPoint(location) else { return nil } guard let cell = tableView?.cellForRowAtIndexPath(indexPath) else { return nil } guard let detailViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Navigation") as? UINavigationController else { return nil } (detailViewController.topViewController as! DetailViewController).passedDetails = self.customerLists[indexPath.row] (detailViewController.topViewController as! DetailViewController).isPresentedBy3Dtouch = true detailVC.preferredContentSize = CGSize(width: 0.0, height: 480.0) previewingContext.sourceRect = cell.frame return detailVC } func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit :UIViewController) { showViewController(viewControllerToCommit, sender: self) } 

这是我几个月前在苹果工程师面前提出的一个问题,到目前为止他们没有回答。 如果调试视图层次结构,您会注意到UITransitionView图层是最顶层的视图,并且未被删除。 这就是导致应用冻结的原因。 实际上,应用程序的function并未冻结 – 它仍然按预期工作,但UI“卡住了”。 这是我在Stack Overflow上的原始post: 如果轻轻触摸,Force Touch动画会冻结

我发现了这个错误的原因。

如果你的视图控制器需要支持强制触摸预览,你需要通过调用- (id )registerForPreviewingWithDelegate:(id)delegate sourceView:(UIView *)sourceView NS_AVAILABLE_IOS(9_0); 这样做的方法。

我只是突然调用了这个函数两次(一次在超类的viewDidLoad() ,一次在sub vc中),当我在sub vc中删除一次时,这个bug被修复了! 惊人…

它仍然是一个Apple漏洞,因为它没有发生这种情况。 但是,希望这个答案可以帮助那些与我有同样问题的开发人员。

我发现了这个bug的另一个可能原因。

在viewControllerForLocation中,我实例化了一个视图控制器来显示…

 func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { let vc = VCImageFullScreen.loadView() return vc } 

…但是这个ViewController在其viewDidAppear中有一个错误的超级调用:

  class VCImageFullScreen : UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewWillAppear(animated) //BUG --> should be super.view**Did**Appear(animated) ... } } 

修复此问题后,一切都按预期工作。