无法在 WKWebView 中更改 UIScrollview 的 contentSize

Posted

技术标签:

【中文标题】无法在 WKWebView 中更改 UIScrollview 的 contentSize【英文标题】:Unable to change contentSize of UIScrollview in WKWebView 【发布时间】:2016-09-26 15:35:20 【问题描述】:

我正在尝试通过调整contentSize 属性为WKWebView 内的UIScrollView 的内容添加一点额外高度。

我可以修改此属性,但在下次布局/显示刷新命中时,它会以某种方式不断变回原来的大小。

为了进一步测试这一点,我尝试将contentSize 更改为scrollViewDidScroll。每当您滚动到底部时,您都可以在几分之一秒内看到它正在尝试添加额外的空间并不断返回。

我无法使用UIWebView 重现此问题。它在那里工作得很好。最近WKWebView 可能添加了一些更改?我正在使用 Xcode 8 并在 ios 9/10 上进行测试。

【问题讨论】:

你能发布一些代码吗?听起来好像您在 scrollviewDidScroll 中所做的任何事情都在其他地方被撤消,但我需要查看您的实现。 @Sparky 当然。这是一个示例项目。 dropbox.com/s/f5d6qsh988no6qp/CantChangeContentSize.zip?dl=0 您好 - 我可能遗漏了一些非常明显的东西,但我无法打开它! @Sparky 我刚刚测试过了。它打开并编译正常。你在什么阶段遇到问题?下载?解压?打开?编译? 对不起,应该更清楚。我打不开链接! (顺便说一下,我没有 Dropbox 帐户) 【参考方案1】:

鉴于我对 Dropbox 的无能,我感觉很糟糕,所以将附件放在一起尝试帮助您。如果您更改 WKWebView 的 scrollView 的 contentInset 属性而不是 contentSize,这似乎工作得很好。我同意你的观点,虽然你可以暂时改变滚动视图的内容大小,但它会很快恢复;此外,对于 UIScrollView 或 WKWebView 都没有委托方法,我发现您可以覆盖这些方法来抵消这种情况。

以下示例代码有一个网页和一些按钮,可让您增加或减少顶部和底部的 contentInset 并动画您到 scrollView 上的适当点。

import UIKit
import WebKit

class ViewController: UIViewController 

    var webView : WKWebView!
    var upButton : UIButton!
    var downButton : UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let webFrame = CGRect(origin: CGPoint(x: 100, y: 100), size: CGSize(width: self.view.frame.width - 200, height: self.view.frame.height - 200))
        webView = WKWebView(frame: webFrame)
        webView.load(URLRequest(url: URL(string: <PUT RELEVANT URL STRING (NB - THAT YOU ARE SURE IS VALID) HERE>)!))
        webView.backgroundColor = UIColor.red
        webView.scrollView.contentMode = .scaleToFill
        self.view.addSubview(webView)

        func getButton(_ label: String) -> UIButton 
            let b : UIButton = UIButton()
            b.setTitle(label, for: .normal)
            b.setTitleColor(UIColor.black, for: .normal)
            b.layer.borderColor = UIColor.black.cgColor
            b.layer.borderWidth = 1.0

            return b
        

        let upButton = getButton("Up")
        let downButton = getButton("Down")

        upButton.frame = CGRect(origin: CGPoint(x: 25, y: 25), size: CGSize(width: 50, height: 50))
        downButton.frame = CGRect(origin: CGPoint(x: 25, y: 100), size: CGSize(width: 50, height: 50))

        upButton.addTarget(self, action: #selector(increaseContentInset), for: .touchUpInside)
        downButton.addTarget(self, action: #selector(decreaseContentInset), for: .touchUpInside)

        self.view.addSubview(webView)
        self.view.addSubview(upButton)
        self.view.addSubview(downButton)
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func increaseContentInset() -> Void 
        guard let _ = webView else  return 

        webView.scrollView.contentInset = UIEdgeInsetsMake(webView.scrollView.contentInset.top + 100, 0, webView.scrollView.contentInset.bottom + 100, 0)

        webView.scrollView.setContentOffset(CGPoint(x: webView.scrollView.contentInset.left, y: -1 * webView.scrollView.contentInset.top), animated: true)

    

    func decreaseContentInset() -> Void 
        guard let _ = webView else  return 

        webView.scrollView.contentInset = UIEdgeInsetsMake(webView.scrollView.contentInset.top - 100, 0, webView.scrollView.contentInset.bottom - 100, 0)

        webView.scrollView.setContentOffset(CGPoint(x: webView.scrollView.contentInset.left, y: -1 * webView.scrollView.contentInset.top), animated: true)
    

我希望这会有所帮助。如果您需要专门基于设置内容大小的答案,请告诉我,但我认为这是最好的选择。

【讨论】:

您好,这个解决方案是一个很好的解决方法。现在在计算一些东西时需要一些额外的工作,但我可以确认它正在工作。谢谢! @Ruiz - 不用担心,很高兴它帮助了你。不过,我可能会问自己关于内容模式的问题,无法覆盖似乎很奇怪。

以上是关于无法在 WKWebView 中更改 UIScrollview 的 contentSize的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 应用中更改 WKWebView 的来源

在 WKWebView 中更改完成按钮的颜色

如何在 WKWebView swift 5 中更改字体大小?

加载 webView 后更改 WKWebView 的 UserAgent

如何检测 amp 页面的 url 何时随 WKWebview 更改

如何更改 WKWebView 文本颜色?