Как добавить кнопки в wkWebView?
Потому что мы делаем wkWebView
в качестве корневого представления кнопка, которую я добавил в свой макет, не отображается на экране. Затем я попытался добавить wkWebView
как подпредставление корневого представления, но приложение вылетает. Потом я узнал о UIBarButtonItem
, но кажется, что вы могли создать только 2 кнопки.
Мне нужно добавить 5 кнопок в любом месте экрана. Есть ли обходной путь для этого? Я новичок в разработке на ios и не очень хорош в использовании конструктора интерфейсов.
После попытки кода @Matic Oblak и размещения его на loadView()
где я делаю wkwebview
При инициализации я получаю сообщение об ошибке "Предупреждение. Попытайтесь представить SomeViewController в WebViewController, чье представление отсутствует в иерархии окон!
Это мой текущий код.
override func loadView() {
// let contentController: WKUserContentController = WKUserContentController()
// let config: WKWebViewConfiguration = WKWebViewConfiguration()
//
// contentController.add(self, name: "callbackHandler")
// config.userContentController = contentController
//
// webView = WKWebView(
// frame: UIScreen.main.bounds,
// configuration: config
// )
//webView.navigationDelegate = self
//webView.translatesAutoresizingMaskIntoConstraints = false
//webView.scrollView.isScrollEnabled = false
//view = webView
if let webViewContainer = webviewContainer {
// Initialize:
let contentController: WKUserContentController = WKUserContentController()
let config: WKWebViewConfiguration = WKWebViewConfiguration()
contentController.add(self, name: "callbackHandler")
config.userContentController = contentController
let webView = WKWebView(frame: webViewContainer.bounds, configuration: WKWebViewConfiguration()) // Create a new web view
webView.translatesAutoresizingMaskIntoConstraints = false // This needs to be called due to manually adding constraints
webView.navigationDelegate = self
webView.translatesAutoresizingMaskIntoConstraints = false
webView.scrollView.isScrollEnabled = false
// Add as a subview:
webViewContainer.addSubview(webView)
// Add constraints to be the same as webViewContainer
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .leading, relatedBy: .equal, toItem: webViewContainer, attribute: .leading, multiplier: 1.0, constant: 0.0))
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .trailing, relatedBy: .equal, toItem: webViewContainer, attribute: .trailing, multiplier: 1.0, constant: 0.0))
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .top, relatedBy: .equal, toItem: webViewContainer, attribute: .top, multiplier: 1.0, constant: 0.0))
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .bottom, relatedBy: .equal, toItem: webViewContainer, attribute: .bottom, multiplier: 1.0, constant: 0.0))
// Assign web view for reference
self.webView = webView
}
}
override func viewDidLoad() {
if(someVar1.isEmpty && someVar2.isEmpty){
showSomeDialog()
}
}
Первые закомментированные строки loadView()
мой предыдущий код для справки.
После размещения кода @Matic Oblak на viewDidLoad()
У меня черный экран. Также после размещения кода звонит SomeViewController
на viewDidAppear()
, ошибка исчезла, но я все еще получаю черный экран.
2 ответа
На самом деле WKWebView
есть небольшая неприятная ошибка, которая вылетает при добавлении в раскадровку. Но вы можете сделать это в коде. Обычно я создаю представление в раскадровке просто как панель веб-просмотра (обычно в полноэкранном режиме, но не при наличии нескольких панелей инструментов), а затем просто добавляю новое веб-представление в качестве подпредставления. Я все еще использую ограничения, чтобы добавить веб-представление:
import UIKit
import WebKit
class WebViewController: UIViewController {
@IBOutlet private var webViewContainer: UIView? // A view on which a web view will be added to
private var webView: WKWebView? // Web view manually added
override func viewDidLoad() {
super.viewDidLoad()
if let webViewContainer = webViewContainer {
// Initialize:
let webView = WKWebView(frame: webViewContainer.bounds, configuration: WKWebViewConfiguration()) // Create a new web view
webView.translatesAutoresizingMaskIntoConstraints = false // This needs to be called due to manually adding constraints
// Add as a subview:
webViewContainer.addSubview(webView)
// Add constraints to be the same as webViewContainer
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .leading, relatedBy: .equal, toItem: webViewContainer, attribute: .leading, multiplier: 1.0, constant: 0.0))
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .trailing, relatedBy: .equal, toItem: webViewContainer, attribute: .trailing, multiplier: 1.0, constant: 0.0))
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .top, relatedBy: .equal, toItem: webViewContainer, attribute: .top, multiplier: 1.0, constant: 0.0))
webViewContainer.addConstraint(NSLayoutConstraint(item: webView, attribute: .bottom, relatedBy: .equal, toItem: webViewContainer, attribute: .bottom, multiplier: 1.0, constant: 0.0))
// Assign web view for reference
self.webView = webView
}
}
}
Так вот webViewContainer
перетаскивается из раскадровки как любой вид, который вы хотите. Это может быть даже основной вид контроллера представления, если вы хотите.
Остальное должно быть объяснено в комментариях.
Таким образом, с помощью этой процедуры вам не нужно "взламывать" добавление подпредставлений поверх всего. Вы можете добавить свою кнопку обычно в вашей раскадровке.
Примечание. Проблема с использованием webViewContainer в качестве основного представления заключается в том, что веб-представление будет добавлено позже, чем остальные представления, поэтому оно может охватывать те, которые вы добавили в раскадровку. Вам нужно либо отправить веб-представление назад, либо перенести наложенные элементы вперед. Это просто добавление webViewContainer.sendSubviewToBack(webView)
но я все еще предпочитаю использовать отдельный вид только для просмотра в Интернете.
Вы можете добавить плавающую кнопку поверх вашего viewcontroller, используя стороннюю библиотеку. Допустим, с помощью Floaty или с любым другим подобным.