在WKWebView中加载html文本
我使用此代码在在WKWebView中加载html文本,html,ios,swift,wkwebview,wkwebviewconfiguration,Html,Ios,Swift,Wkwebview,Wkwebviewconfiguration,我使用此代码在WKWebView中加载包含文本的html文件: do { guard let filePath = Bundle.main.path(forResource: "\(readBookNumber)", ofType: "html") else { print ("File reading error") return } var con
WKWebView
中加载包含文本的html
文件:
do {
guard let filePath = Bundle.main.path(forResource: "\(readBookNumber)", ofType: "html")
else {
print ("File reading error")
return
}
var content = try String(contentsOfFile: filePath, encoding: .utf8)
let baseUrl = URL(fileURLWithPath: filePath)
content.changeHtmlStyle(font: "Iowan-Old-Style", fontSize: UserDefaults.standard.integer(forKey: "textSize"), fontColor: textColor)
webView.loadHTMLString(headerString+content, baseURL: baseUrl)
}
catch {
print ("File HTML error")
}
此代码用于加载用户上次停止阅读的页面:
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad"))
在此方法中,我使用代码加载最后一页:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad"))
}
}
起初我使用了截止日期:。现在()。因为最后一个阅读页面最初是加载的,几秒钟后我在第一页看到了我的文本。我将其更改为deadline:.now()+0.5
,并且文本从最后一页读取时加载良好。它有700页。但现在我想加载另一个1700页的文本。我有和第一次一样的问题。我可以更改截止日期:.now()+1.0
,我的文本将正常加载。但我认为这不是最好的解决办法。我在iPhoneX上运行它。但如果我在iPadMini2上运行它,我可能应该更改截止日期:。现在()+10.0
,因为iPadMini2不是很强大。如何解决这个问题
基于@DPrice代码的更新:
如果我使用此代码:
override func viewDidLoad() {
super.viewDidLoad()
webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)
....
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "estimatedProgress") {
if webView.estimatedProgress == 1.0 {
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad\(self.readBookNumber)"))
}
}
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "estimatedProgress") {
if webView.estimatedProgress == 1.0 {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad\(self.readBookNumber)"))
}
}
}
}
我有和我的代码一样的坏结果
但如果我使用此代码:
override func viewDidLoad() {
super.viewDidLoad()
webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)
....
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "estimatedProgress") {
if webView.estimatedProgress == 1.0 {
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad\(self.readBookNumber)"))
}
}
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "estimatedProgress") {
if webView.estimatedProgress == 1.0 {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad\(self.readBookNumber)"))
}
}
}
}
一切正常。我的最后一页加载很好。但这并不能解决我的问题。您可以添加一个属性观察器,并观察页面加载的估计进度:
override func viewDidLoad() {
super.viewDidLoad()
webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)
....
}
并在加载页面时观察:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "estimatedProgress") {
if webView.estimatedProgress == 1.0 {
print ("page loaded")
}
}
}
在设置偏移量之前,您可以根据页码预测加载过程需要走多远。而不是观察WKWebView。estimatedProgress
您应该观察UIScrollView.contentSize
,因为您需要滚动到可用位置,例如:
var positionY: CGFloat = 1000
var contentSize = CGSize(width: 0, height: 0)
override func viewDidLoad() {
super.viewDidLoad()
...
webView?.scrollView.addObserver(self, forKeyPath: #keyPath(UIScrollView.contentSize), options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == #keyPath(UIScrollView.contentSize)) {
if let contentSize = webView?.scrollView.contentSize, contentSize != self.contentSize {
self.contentSize = contentSize
if contentSize.height > positionY {
webView?.scrollView.setContentOffset(CGPoint(x: 0, y: positionY), animated: true)
}
}
}
}
以下是您的ViewController
类的修改版本:
import UIKit
import WebKit
class ViewController: UIViewController, UIScrollViewDelegate, WKNavigationDelegate {
@IBOutlet weak var webView: WKWebView!
@IBOutlet weak var pagesLabel: UILabel!
var readBookNumber = 0
let headerString = "<meta name=\"viewport\" content=\"initial-scale=1.0\" />"
var textSize = 3
var contentSize: CGSize = .zero
override func viewDidLoad() {
super.viewDidLoad()
// Web View Delegate
webView.scrollView.delegate = self
webView.navigationDelegate = self
webView.scrollView.isPagingEnabled = true
webView.scrollView.alwaysBounceVertical = false
webView.scrollView.showsHorizontalScrollIndicator = true
webView.scrollView.showsVerticalScrollIndicator = false
webView.scrollView.panGestureRecognizer.isEnabled = false
webView.scrollView.pinchGestureRecognizer?.isEnabled = false
webView.scrollView.bouncesZoom = false
self.webView.isOpaque = false;
self.webView.backgroundColor = .clear
// Load File
do {
guard let filePath = Bundle.main.path(forResource: "0", ofType: "html")
else {
print ("File reading error")
return
}
var content = try String(contentsOfFile: filePath, encoding: .utf8)
let baseUrl = URL(fileURLWithPath: filePath)
content.changeHtmlStyle(font: "Iowan-Old-Style", fontSize: 4, fontColor: "black")
webView.loadHTMLString(headerString+content, baseURL: baseUrl)
// add content size Observer
webView.scrollView.addObserver(self, forKeyPath: #keyPath(UIScrollView.contentSize), options: .new, context: nil)
}
catch {
print ("File HTML error")
}
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == #keyPath(UIScrollView.contentSize)) {
let contentSize = webView.scrollView.contentSize
if contentSize != self.contentSize {
self.contentSize = contentSize
DispatchQueue.main.async {
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad"))
}
}
}
}
// MARK: - webView Scroll View
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
self.stoppedScrolling()
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate {
self.stoppedScrolling()
}
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var currentPage = Int((webView.scrollView.contentOffset.x / webView.scrollView.frame.size.width) + 1)
let pageCount = Int(webView.scrollView.contentSize.width / webView.scrollView.frame.size.width)
if currentPage == 0 {
currentPage = 1
} else {
}
if !webView.isHidden {
pagesLabel.text = "\( currentPage ) из \( pageCount )"
} else {
pagesLabel.text = ""
}
}
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
webView.scrollView.pinchGestureRecognizer?.isEnabled = false
}
func stoppedScrolling() {
let pageToLoad = Int((webView.scrollView.contentOffset.x))
UserDefaults.standard.set(pageToLoad, forKey: "pageToLoad")
}
// MARK: - loading webView
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// Маленькая задержка, которую мне хотелось бы использовать
/*DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad"))
}*/
// Большая задержка, которую мне приходится использовать
// don't do this here... we'll do the "auto-scroll" inside the change contentSize Observer
//DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
// self.webView.scrollView.contentOffset.x = CGFloat(UserDefaults.standard.integer(forKey: "pageToLoad"))
//}
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
}
}
extension String {
mutating func changeHtmlStyle(font: String, fontSize: Int, fontColor: String) {
let style = "<font face='\(font)' size='\(fontSize)' color= '\(fontColor)'>%@"
self = String(format: style, self)
}
}
导入UIKit
导入WebKit
类ViewController:UIViewController、UIScrollViewDelegate、WKNavigationDelegate{
@ibvar-webView:WKWebView!
@IBOutlet弱var页面标签:UILabel!
var readBookNumber=0
让headerString=“”
var textSize=3
变量contentSize:CGSize=.0
重写func viewDidLoad(){
super.viewDidLoad()
//Web视图委托
webView.scrollView.delegate=self
webView.navigationDelegate=self
webView.scrollView.isPaginEnabled=true
webView.scrollView.alwaysBounceVertical=false
webView.scrollView.showsHorizontalScrollIndicator=true
webView.scrollView.showsVerticalScrollIndicator=false
webView.scrollView.PangestureRecognitor.isEnabled=false
webView.scrollView.PinchGestureRecognitor?.isEnabled=false
webView.scrollView.bouncesZoom=false
self.webView.isOpaque=false;
self.webView.backgroundColor=.clear
//加载文件
做{
guard let filePath=Bundle.main.path(用于资源:“0”,类型为“html”)
否则{
打印(“文件读取错误”)
返回
}
var content=try字符串(contentsofile:filePath,编码:.utf8)
让baseUrl=URL(fileURLWithPath:filePath)
content.changeThmlStyle(字体:“Iowan Old Style”,字体大小:4,字体颜色:“black”)
loadHTMLString(headerString+内容,baseURL:baseURL)
//添加内容大小观察者
webView.scrollView.addObserver(self,forKeyPath:#keyPath(UIScrollView.contentSize),选项:。新建,上下文:nil)
}
抓住{
打印(“文件HTML错误”)
}
}
重写func observeValue(forKeyPath keyPath:String?,对象的类别:Any?,更改:[NSKeyValueChangeKey:Any]?,上下文:UnasFemeutableRawPointer?){
if(keyPath=#keyPath(UIScrollView.contentSize)){
让contentSize=webView.scrollView.contentSize
如果contentSize!=self.contentSize{
self.contentSize=contentSize
DispatchQueue.main.async{
self.webView.scrollView.contentOffset.x=CGFloat(UserDefaults.standard.integer(forKey:“pageToLoad”))
}
}
}
}
//标记:-网络视图滚动视图
func ScrollViewDiEndDecelling(scrollView:UIScrollView){
self.stoppedScrolling()
}
func ScrollViewDiEndDraging(scrollView:UIScrollView,将减速减速:Bool){
如果!减速{
self.stoppedScrolling()
}
}
func scrollViewDidScroll(scrollView:UIScrollView){
var currentPage=Int((webView.scrollView.contentOffset.x/webView.scrollView.frame.size.width)+1)
让pageCount=Int(webView.scrollView.contentSize.width/webView.scrollView.frame.size.width)
如果currentPage==0{
当前页面=1
}否则{
}
如果!webView.ishiden{
pagesLabel.text=“\(当前页面)з\(页面计数)”
}否则{
pagesLabel.text=“”
}
}
func scrollView将开始缩放(scrollView:UIScrollView,带视图:UIView?){
webView.scrollView.PinchGestureRecognitor?.isEnabled=false
}
func停止滚动(){
让pageToLoad=Int((webView.scrollView.contentOffset.x))
UserDefaults.standard.set(pageToLoad,forKey:“pageToLoad”)
}
//MARK:-正在加载webView
func webView(webView:WKWebView,didStartProvisionalNavigation:WKNavigation!){
}
func webView(webView:WKWebView,didfish导航:WKNavigation!){
// Маленькая задержка, которую мне хотелось бы использовать
/*DispatchQueue.main.asyncAfter(截止日期:.now()+0.5){
self.webView.scrollView.contentOffset.x=CGFloat(UserDefaults.standard.integer(forKey:“pageToLoad”))
}*/