Причины ограничения высоты WKWebView: Невозможно одновременно удовлетворить ограничения - PullRequest
0 голосов
/ 04 июня 2019

У меня есть TableCellView, который содержит следующие представления:

class MyCell: UITableViewCell {

    var headerStackView: UIStackView = {
        var stackView = UIStackView()
        stackView.axis = .horizontal
        stackView.distribution = .fillEqually
        stackView.spacing = 0
        stackView.contentMode = .scaleToFill
        stackView.translatesAutoresizingMaskIntoConstraints = false
        return stackView
    }()

    var pointsStackView: UIStackView = {
        var stackView = UIStackView()
        stackView.axis = .horizontal
        stackView.distribution = .fillEqually
        stackView.spacing = 10
        stackView.contentMode = .scaleToFill
        stackView.translatesAutoresizingMaskIntoConstraints = false
        return stackView
    }()

    var webContainerView: UIView = {
        var webCont = UIView()
        webCont.translatesAutoresizingMaskIntoConstraints = false
        return webCont
    }()

    var contentWKWebView: WKWebView = {
        let preferences = WKPreferences()
        preferences.javaScriptEnabled = true

        let configuration = WKWebViewConfiguration()
        configuration.preferences = preferences
        let jsPath = Bundle.main.path(forResource: "web_assets/jqmath-0.4.0", ofType: "css")!
        let baseUrl = URL(fileURLWithPath: jsPath)
        let html_loading = "<html><body><h1>Loading ...</h1></body></html>"

        var wkwv = WKWebView(frame: .zero, configuration: configuration)
        wkwv.loadHTMLString(html_loading, baseURL: baseUrl)
        wkwv.scrollView.isScrollEnabled = false
        wkwv.scrollView.bounces = false
        wkwv.translatesAutoresizingMaskIntoConstraints = false
        return wkwv
    }()

    var webViewHeightConstraint: NSLayoutConstraint?

Тогда init имеет следующие строки:

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    print ("Inside INIT")
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.addSubview(self.headerStackView)
    self.addSubview(self.pointsStackView)
    self.addSubview(self.webContainerView)
    self.webContainerView.addSubview(self.contentWKWebView)

    headerStackView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
    headerStackView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
    headerStackView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true
    headerStackView.bottomAnchor.constraint(equalTo: self.pointsStackView.topAnchor, constant: -10).isActive = true

    pointsStackView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 10).isActive = true
    pointsStackView.bottomAnchor.constraint(equalTo: self.webContainerView.topAnchor, constant: -10).isActive = true

    webContainerView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
    webContainerView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
    webContainerView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -10).isActive = true

    contentWKWebView.navigationDelegate = self
    contentWKWebView.leftAnchor.constraint(equalTo: self.webContainerView.leftAnchor, constant: 2).isActive = true
    contentWKWebView.rightAnchor.constraint(equalTo: self.webContainerView.rightAnchor, constant: -2).isActive = true
    contentWKWebView.topAnchor.constraint(equalTo: self.webContainerView.topAnchor, constant: 2).isActive = true
    contentWKWebView.bottomAnchor.constraint(equalTo: self.webContainerView.bottomAnchor, constant: -2).isActive = true
    webViewHeightConstraint = contentWKWebView.heightAnchor.constraint(equalToConstant: 100)
    webViewHeightConstraint?.isActive = true

Func layoutSubviews просто устанавливает некоторые значения в различные представления.

Я использую следующий код для настройки высоты WKWebView в соответствии с содержимым HTML:

extension MyCell: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.documentElement.scrollHeight", completionHandler: { (height, error) in
            self.webViewHeightConstraint?.constant = height as! CGFloat
        })
    }
}

Две строки:

webViewHeightConstraint = contentWKWebView.heightAnchor.constraint(equalToConstant: 100)
webViewHeightConstraint?.isActive = true

испортил все остальные ограничения, и я получил:

Невозможно одновременно удовлетворить ограничения

С длинным списком конфликтующих ограничений.

Если я закомментирую их, у меня не будет конфликтов ограничений, но тогда WKWebView ничего не показывает (возможно, потому что у него нет инициализированного ограничения высоты.

Чего мне не хватает?

...