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 не владеет или не использует навигационный контроллер, в который вы его нажимаете, кнопка "открыть в сафари" не отображается, и это доставит неудобства вашим пользователям.

Другие вопросы по тегам