3D Touch Peek с верхней панелью
У меня есть UICollectionView, который показывает "Peek", когда 3D Touch"под ред. В качестве поведения по умолчанию "Peek" игнорирует навигационные панели.
Тем не менее, я хочу показать столбец так же, как в iMessage Peek, показанном ниже:
Оба контроллера View Collection и Peek View Controller находятся внутри контроллера навигации.
У меня есть следующий фрагмент из приведенного ниже примера кода 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)
}
ОБНОВИТЬ
Благодаря Лео Натану мне удалось достичь выше:
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)
}
Тем не менее, это создает новый навигационный контроллер. Если я хочу получить тот же контроллер навигации, я могу сделать это:
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) извлекает viewController из своего контроллера навигации. Есть ли у этого минусы?
1 ответ
В previewingContext(_:, viewControllerForLocation:)
оберните свой контроллер вида в UINavigationController
и верни это.