Как добавить кнопки в wkWebView? - PullRequest
0 голосов
/ 18 октября 2018

Поскольку мы делаем 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 ]

0 голосов
/ 18 октября 2018

На самом деле 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), но я все еще предпочитаю использовать отдельное представление только для веб-просмотра.

0 голосов
/ 18 октября 2018

Вы можете добавить плавающую кнопку поверх вашего viewcontroller, используя стороннюю библиотеку.Скажем, используя Floaty или с любым другим подобным.

...