SFSafariViewController некорректно отображается при нажатии в UINavigationController с modalPresentationStyle = .FormSheet
У меня есть простое представление таблицы настроек, которое является первым представлением UINavigationController.
Я представляю контроллер UINavigationController с параметром.FormSheet modalPresentationStyle, что означает, что на iPhone он занимает весь экран, а на iPad он отображается по центру.
Теперь я хочу, чтобы одна из строк в таблице "Настройки" поместила SFSafariViewController в стек навигации.
Это отлично работает на iPhone, но на iPad - нет. скриншот iPad:
Обратите внимание, что часть панели навигации SFSafariViewController отображается под панелью навигации (с кнопкой "Назад" в разделе "Настройки"). Смотрите красный прямоугольник на изображении.
let urlText = "http://www.apple.com"
let url = NSURL(string: urlText)!
let safariViewController = SFSafariViewController(URL: url)
self.navigationController?.pushViewController(safariViewController, animated: true)
На iPhone вы вообще не видите панель навигации SFSafariViewController - что идеально подходит для моего случая использования.
Какие-нибудь магические настройки, чтобы заставить это работать правильно?
3 ответа
SFSafariViewController доступен для iOS9.0 или более поздней версии Apple OS. В соответствии с вашей проблемой вы столкнулись с некоторой проблемой, покажите пробел в панели навигации с помощью SFSafariViewController view.because
SFSafariViewController - это встроенная собственная панель навигации, UISearchbar, UIBarButton. Когда вы нажимаете SFSafariViewController из ViewController, затем вы показываете панель навигации приложения через панель навигации SFSafariViewController.
Это не совсем исправление, но вот что я в итоге сделал в этой ситуации. Вместо того, чтобы нажать на контроллер навигации, я делаю следующее
let sfController = SFSafariViewController(URL: NSURL(string:"url")!)
sfController.modalPresentationStyle = .FormSheet
sfController.modalTransitionStyle = .CrossDissolve
presentViewController(sfController, animated: false, completion: nil)
Мне пришлось отключить анимацию, так как в противном случае она пыталась ввести контроллер вида справа. CrossDissolve заботится об исходящей анимации. Это может быть не то, что вы хотите, хотя в вашем случае вы хотите скрыть URL-адрес и сохранить панель навигации там, где этот способ покрывает панель навигации и показывает панель навигации SFSafariViewController. На самом деле SFSafariViewController не должен использоваться таким образом, хотя ваша работа с использованием WKWebView имеет больше смысла в вашем случае.
Еще одно замечание: использование pushViewController фактически отклонит весь контроллер навигации, когда вы нажмете кнопку "Готово" в SFSafariViewController, так что в большинстве случаев presentViewController будет лучшим способом отображения, если только вы не хотите такого типа поведения.
Я пришел к выводу, что невозможно подтолкнуть SFSafariViewController
на ранее существовавший UINavigationController
, Он поставляется с собственной панелью навигации и панелью инструментов.
Хотя он работает довольно хорошо на iPhone (по крайней мере, на iOS 10+), когда он помещается в существующий контроллер навигации, у него есть проблемы на iPad, поэтому будьте осторожны, если вы делаете это в приложении Universal.
В частности, на iPad нет панели инструментов в SFSafariViewController
вместо этого кнопка "Открыть в сафари" отображается непосредственно в самой панели навигации в правом верхнем углу. поскольку SFSafariViewController
не владеет или не использует навигационный контроллер, в который вы его нажимаете, кнопка "открыть в сафари" не отображается, и это доставит неудобства вашим пользователям.