program kits developer apple app ios swift uiviewcontroller 3dtouch peek-pop

ios - kits - 3D Touch Peek con barra superior



iphone store (1)

En previewingContext(_:, viewControllerForLocation:) , previewingContext(_:, viewControllerForLocation:) su controlador de vista en un UINavigationController y devuélvalo.

Tengo un UICollectionView que muestra ''Peek'' cuando 3D Touch ''ed. Como comportamiento predeterminado, ''Peek'' ignora las barras de navegación.

Sin embargo, sí quiero mostrar una barra igual que en iMessage Peek que se muestra a continuación:

Tanto el controlador de vista de colección como el controlador de vista de Peek están dentro del controlador de vista de navegación.

Tengo un fragmento de código de muestra de Apple a continuación que intento modificar a las necesidades anteriores:

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) }

ACTUALIZAR

Gracias a Leo Natan pude lograr lo anterior:

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) }

Sin embargo, esto crea un NUEVO Controlador de navegación. Si quiero terminar con el mismo Controlador de navegación, puedo hacer esto:

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 como UIController) .viewControllers [0], sender: self) extrae viewController de su controlador de navegación. ¿Tiene esto algún inconveniente?