У меня есть 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 ничего не показывает (возможно, потому что у него нет инициализированного ограничения высоты.
Чего мне не хватает?