У меня есть splitViewController, который отображает список монстров и для каждого монстра, его информацию и WkWebView.
Я был вдохновлен raywenderlich tuto для кодирования моей логики splitViewController.
protocol DetailSelectionDelegate: class {
func monsterSelected(newMonster: Monster)
}
class MasterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISplitViewControllerDelegate, UIScrollViewDelegate, CAAnimationDelegate, WKNavigationDelegate, WKUIDelegate, UINavigationControllerDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let monsters : Monster = self.allMonstersArray[indexPath.row] as! Post
delegate?.monsterSelected(newMonster:monster)
self.tableView.deselectRow(at: indexPath, animated: false)
}
}
extension DetailViewController: DetailSelectionDelegate {
func monsterSelected(newMonster: Monster) {
monster = newMonster
}
}
class DetailViewController: UIViewController, UIScrollViewDelegate, WKUIDelegate, WKNavigationDelegate {
var monster: Monster? {
didSet {
refreshUI()
}
}
func refreshUI() {
loadViewIfNeeded()
nameLabel.text = monster?.name
descriptionLabel.text = monster?.description
self.webView.loadHTMLString(monster!.setContentHtml(), baseURL: Bundle.main.resourceURL)
}
override func loadView() {
super.loadView()
self.webView = WKWebView()
if (self.webView != nil) {
self.webView!.frame = self.webviewContainer.frame
self.webView.uiDelegate = self
self.webView.navigationDelegate = self
self.webView.translatesAutoresizingMaskIntoConstraints = false
self.webView.scrollView.isScrollEnabled = false
self.webView.scrollView.bounces = false
self.webView.scrollView.bouncesZoom = false
self.webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
if #available(iOS 11.0, *) {
self.webView.scrollView.contentInsetAdjustmentBehavior = .never
}
self.webviewContainer.addSubview(self.webView!)
NSLayoutConstraint.activate([
self.webView.topAnchor.constraint(equalTo: self.webviewContainer.topAnchor),
self.webView.bottomAnchor.constraint(equalTo: self.webviewContainer.bottomAnchor),
self.webView.leadingAnchor.constraint(equalTo: self.webviewContainer.leadingAnchor),
self.webView.trailingAnchor.constraint(equalTo: self.webviewContainer.trailingAnchor)
])
}
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
DispatchQueue.main.async(execute: {
self.heightWebviewConstraint.constant = self.webView.scrollView.contentSize.height
self.view.setNeedsLayout()
self.view.setNeedsUpdateConstraints()
})
}
}
С кодом выше, когда приложение запускается, все работает нормально, wkwebview первого монстра корректно отображается, его высота в порядке.
Когда приложение вызывает didSelectRowAt для отображения другого монстра, все содержимое нового монстра обновляется, включая wkwebview.НО новый wkwebview имеет высоту предыдущего монстра.Его высота не обновляется.
Я пытался удалить wkwebview из суперпредставления и переадресовать его, но та же проблема: (
Я не понимаю, почему и чего мне не хватает.