ios swift uistackview обновляет дочерние значения высоты и x, y положения кадра - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть ячейка таблицы с таким макетом -

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()
    }

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

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

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

1 Ответ

1 голос
/ 07 апреля 2019

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

...