简体   繁体   English

带顶栏的 3D Touch Peek

[英]3D Touch Peek with Top Bar

I have a UICollectionView that shows 'Peek' when 3D Touch 'ed.我有一个UICollectionView ,它在3D Touch ed 时显示“Peek”。 As default behavior, 'Peek' ignores navigation bars.作为默认行为,“Peek”忽略导航栏。

However, I do want to show a bar just as in iMessage Peek shown below:但是,我确实想像在iMessage Peek中一样显示一个栏,如下所示:

在此处输入图片说明

Both Collection View Controller & Peek View Controller are inside Navigation View Controller. Collection View Controller 和 Peek View Controller 都在 Navigation View Controller 中。

I have following snippet from Apple's Sample code below that I am trying to modify in to above needs:我在下面的 Apple 示例代码中有以下片段,我正在尝试将其修改为上述需求:

extension ChatTableViewController: UIViewControllerPreviewingDelegate {
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        guard let indexPath = tableView.indexPathForRow(at: location) else { return nil }

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: ChatDetailViewController.identifier)
        guard let chatDetailViewController = viewController as? ChatDetailViewController else { return nil }

        chatDetailViewController.chatItem = chatItem(at: indexPath)
        let cellRect = tableView.rectForRow(at: indexPath)
        previewingContext.sourceRect = previewingContext.sourceView.convert(cellRect, from: tableView)
        chatDetailViewController.isReplyButtonHidden = true

        return chatDetailViewController
    }

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        if let chatDetailViewController = viewControllerToCommit as? ChatDetailViewController {
            chatDetailViewController.isReplyButtonHidden = false
        }
        show(viewControllerToCommit, sender: self)
    }

UPDATE更新

Thanks to Leo Natan I was able to accomplish above:感谢Leo Natan,我能够完成上述任务:

extension ChatTableViewController: UIViewControllerPreviewingDelegate {
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        guard let indexPath = tableView.indexPathForRow(at: location) else { return nil }

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: ChatDetailViewController.identifier)
        guard let chatDetailViewController = viewController as? ChatDetailViewController else { return nil }

        chatDetailViewController.chatItem = chatItem(at: indexPath)
        let cellRect = tableView.rectForRow(at: indexPath)
        previewingContext.sourceRect = previewingContext.sourceView.convert(cellRect, from: tableView)
        chatDetailViewController.isReplyButtonHidden = true

        let navigationController = UINavigationController(rootViewController: viewController
        return navigationController
    }

    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        if let chatDetailViewController = viewControllerToCommit as? ChatDetailViewController {
            chatDetailViewController.isReplyButtonHidden = false
        }
        show(viewControllerToCommit, sender: self)
    }

However, this creates a NEW Navigation Controller.但是,这会创建一个新的导航控制器。 If I want to end up with the same same Navigation Controller, I can do this:如果我想以相同的导航控制器结束,我可以这样做:

func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
    if let chatDetailViewController = viewControllerToCommit as? ChatDetailViewController {
        chatDetailViewController.isReplyButtonHidden = false
    }

    show((viewControllerToCommit as UIController).viewControllers[0], sender: self)
}

show((viewControllerToCommit as UIController).viewControllers[0], sender: self) extracts the viewController out of it's Navigation Controller. show((viewControllerToCommit as UIController).viewControllers[0], sender: self)从它的导航控制器中提取视图控制器。 Does this have any downsides?这有什么缺点吗?

previewingContext(_:, viewControllerForLocation:) ,将您的视图控制器包装在UINavigationController并返回。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM