无法在WKWebView中更改UIScrollview的contentSize

时间:2016-09-26 15:35:20

标签: ios swift uiscrollview uiwebview wkwebview

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

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

为了进一步测试,我尝试更改contentSize中的scrollViewDidScroll。无论何时滚动到底部,您都可以看到它正在尝试添加额外空间并保持还原状态。

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

1 个答案:

答案 0 :(得分:1)

鉴于我对Dropbox的无能,我感觉很糟糕所以把它们放在一起试图帮助你。如果更改WKWebView的scrollView而不是contentSize的contentInset属性,这似乎工作得很好。我同意你的看法,虽然你可以暂时改变scrollView的内容大小,但它会很快恢复;此外,我找不到UIScrollView或WKWebView的委托方法,你可以覆盖它来抵消这种方法。

以下示例代码包含一个网页和一些按钮,可让您增加或减少topIn和bottomInset,并将您设置为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)
    }
}

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