ios swift uistackview更新子高度和x,y帧位置值

问题描述 投票:0回答:1

我有一个像这样的布局的tableview单元格 -

ContentView 
   - StackView
       - Fixed Height UILabel
       - UIView (Webview Container)
       - Fixed Height UILabel
       - ... more views

现在我想在这个UIView里面添加一个webview,就像这样 -

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
    }

我为堆栈视图和webview容器创建了以下插座 -

@IBOutlet weak var questionView: UIView!
@IBOutlet weak var rootStack: UIStackView!

并使questionView框架大小等于webview的内容大小我这样做 -

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

这会更新webview大小及其容器的大小,但由于某种原因,stackview中webview容器之后的元素未更新,因此它们与webview容器重叠

那么,在设置questionView的高度等于其webview的内容后,如何更新stackview视图?

或者是否有另一种方法可以使questionView(webview容器)高度根据其内容动态变化,并在其高度变化时使其余视图向下移动?

ios swift wkwebview nslayoutconstraint uistackview
1个回答
1
投票

您已使用autolayout设置了stackview和其他视图的大小,并且您正在使用框架设置webview和容器视图的大小。因此,stackview和其中的其他视图无法调整。而不是给webview的容器一个框架,将其四个墙限制为webview的四个墙,并为webview提供一个高度约束。

© www.soinside.com 2019 - 2024. All rights reserved.