簡體   English   中英

contentOffset.x 在 vi​​ewDidLoad 中不起作用

[英]contentOffset.x doesn't work in viewDidLoad

我在webView有水平滾動。 我需要從位置x = 1000顯示webView文本。 為此,我使用以下行:

self.webView.scrollView.contentOffset.x = 1000

問題是這一行只適用於scrollViewDidScroll方法,如果我在方法中使用它,那么之后我無法滾動我的webView因為它總是在x = 1000

viewDidLoad該行不起作用。 我需要在哪里編寫它以便它在webView開始時webView ,然后我可以正確滾動我的 webView 。

代碼:

import UIKit
import WebKit

class ViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        webView?.scrollView.delegate = self
        
        do {
            guard let filePath = Bundle.main.path(forResource: "index", ofType: "html")
                else {
                    print ("File reading error")
                    return
            }
            
            let headerString = "<meta name=\"viewport\" content=\"initial-scale=1.0\" />"
            let string =  try String(contentsOfFile: filePath, encoding: .utf8)
            let baseUrl = URL(fileURLWithPath: filePath)
            webView.loadHTMLString(headerString+string, baseURL: baseUrl)
            webView.scrollView.isPagingEnabled = true
            
            self.webView.scrollView.contentOffset.x = 1000
        }
        catch {
            print ("File HTML error")
        }
    }

}

此行在viewDidLoad也不起作用

webView.scrollView.setContentOffset(CGPoint(x: 1000, y: 0), animated: false)

我認為 - 因為在WKWebview加載、格式化和顯示 html 時會發生很多事情 - 它不會像您希望的那樣簡單。

我發現有幾種方法可以解決這個問題......

首先,為了調用didFinish navigation ,請確保您的控制器符合WKNavigationDelegate

class ViewController: UIViewController, WKNavigationDelegate { }

並且,在viewDidLoad()中將 web 視圖的委托設置為 self :

webView.navigationDelegate = self

那么,兩種選擇...

選項 1 -- 動畫偏移。 我不知道您的需求,但這可能對您有用,並且它會通知用戶他正在查看 html 的已滾動部分:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.scrollView.setContentOffset(CGPoint(x: 1000, y: 0), animated: true)
}

選項 2 -- 延遲設置偏移量。 看來我們需要一點延遲,0.01 秒似乎有效:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
        webView.scrollView.contentOffset.x = 1000
    }
}

根據您的實際 html 內容,這可能會顯示為突然閃爍,所以...

選項 3 - 延遲設置偏移,然后淡入視圖。 viewDidAppear()設置webView.alpha = 0.0 ,然后:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
        webView.scrollView.contentOffset.x = 1000
        UIView.animate(withDuration: 0.3, animations: {
            webView.alpha = 1.0
        })
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM