Ios swift uistackview обновляет высоту дочерних элементов и значения положения кадра x, y

У меня есть ячейка 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()
    }

Это обновляет размер веб-просмотра и размер его контейнера, но по какой-то причине элементы после контейнера веб-просмотра в стеке не обновляются и, следовательно, они перекрываются с контейнером веб-просмотра.

Итак, как я могу обновить представление стека после того, как я установил высоту вопроса, равную содержимому его веб-представления?

Или есть другой способ сделать высоту вопроса (контейнера веб-просмотра) динамической в ​​соответствии с его содержимым и заставить остальные представления перемещаться вниз при изменении его высоты?

У вас есть образец для этого?

karthikeyan 28.04.2019 07:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
977
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы установили размер стека и другого представления с помощью автомакета, и вы устанавливаете размер веб-просмотра и представления контейнера с помощью фреймов. Из-за этого stackview и другие представления внутри него не могут быть скорректированы. Вместо того, чтобы давать контейнеру веб-просмотра рамку, ограничьте его четыре стены четырьмя стенами веб-просмотра и дайте веб-просмотру ограничение по высоте.

Спасибо, теперь это работает для меня. Еще один вопрос. У меня есть это представление стека внутри ячейки таблицы, но поскольку для строк таблицы требуется явная высота, я только что присвоил ей достаточно большое число (1000), но теперь могу ли я также установить размер ячейки представления таблицы равным на высоту этого стека?

Harshit Laddha 07.04.2019 08:07

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

Jayant Jaiswal 07.04.2019 08:13

Итак, я увидел этот пост stackoverflow.com/questions/39626182/… для переопределения метода invalidateIntrinsicContentSize(), и этот метод доступен внутри моей ячейки. Но я не могу найти какое-либо определение функции для переопределения для innerContentSize как в моем контроллере табличного представления, так и в ячейке табличного представления. Как я могу переопределить этот размер содержимого внутри ячейки после этого обновления высоты?

Harshit Laddha 07.04.2019 08:25

это не функция, это свойство uiview. Переопределите его в tableviewcell

Jayant Jaiswal 07.04.2019 08:29

Итак, я сделал это - переопределил 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(), но размер ячейки не меняется

Harshit Laddha 07.04.2019 08:42

сделать что-то вроде переопределения var innerContentSize: CGSize { var size = super.intrinsicContentSize size.height = <высота представления стека> возвращаемый размер}

Jayant Jaiswal 07.04.2019 08:53

Давайте продолжить обсуждение в чате.

Harshit Laddha 07.04.2019 09:01

Другие вопросы по теме