[英]Changing view's alpha based on UIScrollView's contentOffset.x when scrolling multiple screens
[英]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.