如何将UIActivityIndicatorView添加到WKWebView的中心位置
问题原因
- 时序错误:初始化spinner时就设置其frame依赖webView的宽高,但此时webView还没有被设置有效frame,宽高均为0,spinner的中心点坐标最终计算为(0,0),自然显示在左上角。后续webView的frame更新后,spinner的frame不会自动同步调整,位置就不会变化。
- 自动布局规则不完整:当你给webView设置
translatesAutoresizingMaskIntoConstraints = false后,你之前设置的webView frame会自动失效,必须手动给webView添加位置和尺寸约束,否则系统无法确定webView的布局,就会出现布局歧义警告、webView完全不显示的问题。 - 视图层级问题:最初将spinner作为webView的子视图添加,会被webView的边框层、内容层覆盖,所以显示在边框下方。
修正后的代码
var webView = WKWebView() var detailItem : CountriesFinal? var spinner = UIActivityIndicatorView() override func viewDidLoad() { super.viewDidLoad() // 先配置webView的自动布局约束 webView.translatesAutoresizingMaskIntoConstraints = false webView.navigationDelegate = self webView.backgroundColor = .blue webView.layer.borderWidth = 5 webView.layer.borderColor = UIColor.red.cgColor webView.contentMode = .scaleAspectFit self.view.addSubview(webView) // 给webView添加固定位置和尺寸约束,替换原来的frame设置 NSLayoutConstraint.activate([ webView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 125), webView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 150), webView.widthAnchor.constraint(equalToConstant: 250), webView.heightAnchor.constraint(equalToConstant: 150) ]) // 配置spinner的自动布局,让它一直居中在webView上方 spinner.translatesAutoresizingMaskIntoConstraints = false spinner.hidesWhenStopped = true self.view.insertSubview(spinner, aboveSubview: webView) NSLayoutConstraint.activate([ spinner.centerXAnchor.constraint(equalTo: webView.centerXAnchor), spinner.centerYAnchor.constraint(equalTo: webView.centerYAnchor) ]) spinner.startAnimating() }
替代方案
如果你不需要webView自适应不同尺寸的屏幕,也可以不设置translatesAutoresizingMaskIntoConstraints = false,保留原来的frame设置,同时添加如下方法更新spinner位置即可:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() spinner.center = webView.center }
内容的提问来源于stack exchange,提问作者PowerPlay
相关产品推荐
相关产品推荐

