У меня есть ячейка tableview с таким макетом:
ContentView
- StackView
- Fixed Height UILabel
- UIView (Webview Container)
- Fixed Height UILabel
- ... more views
Теперь я пытаюсь добавить веб-просмотр внутри этого UIView следующим образом:
func prepareQuestionWebView() {
let webConfiguration = WKWebViewConfiguration()
let contentController = WKUserContentController();
webConfiguration.userContentController = contentController
webView = WKWebView(frame: CGRect(origin: CGPoint.zero, size: questionView.frame.size))
webView?.scrollView.isScrollEnabled = false
webView?.scrollView.bounces = false
webView?.scrollView.bouncesZoom = false
webView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
webView?.translatesAutoresizingMaskIntoConstraints = false
webView?.tag = -1
webView?.navigationDelegate = self
questionView.removeAllSubviews()
questionView.addSubview(webView!)
webView?.contentScaleFactor = 1
}
Я создал следующие выходы для своего представления стека и контейнера веб-просмотра:
@IBOutlet weak var questionView: UIView!
@IBOutlet weak var rootStack: UIStackView!
и чтобы размер кадра questionView был равен размеру содержимого веб-просмотра, я делаю это -
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
if webView.isLoading == false {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (result, error) in
if let height = result as? CGFloat {
self.setHeightData(height, webView)
}
})
}
}
}
func setHeightData(_ height: CGFloat, _ wv: WKWebView) {
switch wv.tag {
case -1:
questionView.frame = CGRect.init(x: 0, y: 36, width: rootStack.frame.width, height: height)
default:
break
}
wv.layoutSubviews()
questionView.layoutIfNeeded()
rootStack.layoutSubviews()
rootStack.layoutIfNeeded()
}
Это обновляет размер веб-просмотра и размер его контейнера, но по какой-то причине элементы после контейнера веб-просмотра в стеке не обновляются и, следовательно, они перекрываются с контейнером веб-просмотра.
Итак, как я могу обновить представление стека после того, как я установил высоту вопроса, равную содержимому его веб-представления?
Или есть другой способ сделать высоту вопроса (контейнера веб-просмотра) динамической в соответствии с его содержимым и заставить остальные представления перемещаться вниз при изменении его высоты?





Вы установили размер стека и другого представления с помощью автомакета, и вы устанавливаете размер веб-просмотра и представления контейнера с помощью фреймов. Из-за этого stackview и другие представления внутри него не могут быть скорректированы. Вместо того, чтобы давать контейнеру веб-просмотра рамку, ограничьте его четыре стены четырьмя стенами веб-просмотра и дайте веб-просмотру ограничение по высоте.
Спасибо, теперь это работает для меня. Еще один вопрос. У меня есть это представление стека внутри ячейки таблицы, но поскольку для строк таблицы требуется явная высота, я только что присвоил ей достаточно большое число (1000), но теперь могу ли я также установить размер ячейки представления таблицы равным на высоту этого стека?
вы можете переопределить внутренний размер содержимого ячейки таблицы, чтобы включить высоту представления стека.
Итак, я увидел этот пост stackoverflow.com/questions/39626182/… для переопределения метода invalidateIntrinsicContentSize(), и этот метод доступен внутри моей ячейки. Но я не могу найти какое-либо определение функции для переопределения для innerContentSize как в моем контроллере табличного представления, так и в ячейке табличного представления. Как я могу переопределить этот размер содержимого внутри ячейки после этого обновления высоты?
это не функция, это свойство uiview. Переопределите его в tableviewcell
Итак, я сделал это - переопределил var innerContentSize: CGSize {get {return CGSize(width: self.contentView.width, height: self.contentView.height)} set {invalidateIntrinsicContentSize()}}, а затем попытался установить это свойство как - innerContentSize = CGSize.init(width: rootStack.frame.width, height: rootStack.frame.height) self.invalidateIntrinsicContentSize(), но размер ячейки не меняется
сделать что-то вроде переопределения var innerContentSize: CGSize { var size = super.intrinsicContentSize size.height = <высота представления стека> возвращаемый размер}
Давайте продолжить обсуждение в чате.
У вас есть образец для этого?