app - wkwebview swift 4
Tamaño de contenido dinámico de UIWebView (7)
De acuerdo, me di cuenta de lo que estaba haciendo mal, así que ahora sé cómo llamar a esta función. Antes que nada se suponía que debía llamar a UIWebViewDelegate en mi clase. Luego configure my var jobSkillView en (jobSkillView.delegate = self). Ahora aquí es donde cometí mi mayor error. En mi código, tenía una declaración if else en la que estaba lanzando mi func webViewDidLoad. Se suponía que debía ponerlo fuera de esa declaración y en la clase real para anular mi marco para UIWebView. Hablando de marco **** NO OLVIDE DE CONFIGURAR SU ALTURA DE MARCO A 1. Entonces, y solo entonces, esta función funcionará para su UIWebView. Después de eso, debe tener una altura de base totalmente funcional para su UIWebView for Swift.
He estado mirando alrededor y no he podido ver ninguna forma rápida de hacerlo. Estoy intentando que mi altura de UIWebViews sea dinámica. Tengo un UIWebView que carga datos usando la función loadHtmlString. Lo que ocurre es que estoy cargando los datos de una base de datos sqlite, cada vez que cargo una cadena diferente con diferente longitud y, naturalmente, la vista web obtiene una altura diferente.
Ahora necesito saber cómo hacer que UIWebView tenga la altura exacta para cargar mi próximo contenido directamente debajo de webView. Esto es lo que tengo hasta ahora
var jobSkillView = UIWebView(frame: CGRectMake(-5, 480.0, screenWidth, 300.0))
jobSkillView.loadHTMLString("<html><body p style=''font-family:arial;font-size:16px;''>" + jobSkills + "</body></html>", baseURL: nil)
jobSkillView.stringByEvaluatingJavaScriptFromString("document.body.innerHTML")
jobSkillView.scrollView.scrollEnabled = true
jobSkillView.scrollView.bounces = true
jobSkillView.sizeToFit()
border.addSubview(jobSkillView)
Encontré algo así en SO, pero no estoy seguro de cómo vincularlo al marco de UIWebView
:
func webViewDidFinishLoad(jobSkillView : UIWebView){
// Change the height dynamically of the UIWebView to match the html content
var jobSkillViewFrame: CGRect = jobSkillView.frame
jobSkillViewFrame.size.height = 1
jobSkillView.frame = jobSkillViewFrame
var fittingSize: CGSize = (jobSkillView.sizeThatFits(CGSizeZero))
jobSkillViewFrame.size = fittingSize
// webViewFrame.size.width = 276; Making sure that the webView doesn''t get wider than 276 px
jobSkillView.frame = jobSkillViewFrame
var jobSkillViewHeight = jobSkillView.frame.size.height
}
Aquí está mi clase personalizada para trabajar con UIWebViews personalizadas, tiene todo para obtener la altura correcta del contenido de la vista de desplazamiento, establecer la altura de UIWebView y crear una restricción de altura personalizada para que funcione el autolayout. También carga un poco de estilo CSS personalizado ...
class CustomUIWebView: UIWebView, UIWebViewDelegate {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.scrollView.scrollEnabled = false
self.scrollView.bounces = false
self.delegate = self
}
override init(frame: CGRect) {
super.init(frame: frame)
self.scrollView.scrollEnabled = false
self.scrollView.bounces = false
self.delegate = self
}
override func loadHTMLString(string: String!, baseURL: NSURL!) {
var cssURL:String = NSBundle.mainBundle().pathForResource("webview", ofType: "css")!
var s:String = "<html><head><title></title><meta name=/"viewport/" content=/"initial-scale=1, user-scalable=no, width=device-width/" /><link rel=/"stylesheet/" href=/"./webview.css/" ></link></head><body>"+string+"</body></html>";
var url:NSURL
if baseURL == nil {
url = NSBundle.mainBundle().bundleURL
} else {
url = baseURL
}
super.loadHTMLString(s, baseURL: url)
}
func webViewDidFinishLoad(webView: UIWebView) {
self.webViewResizeToContent(webView)
}
func webViewResizeToContent(webView: UIWebView) {
webView.layoutSubviews()
// Set to smallest rect value
var frame:CGRect = webView.frame
frame.size.height = 1.0
webView.frame = frame
var height:CGFloat = webView.scrollView.contentSize.height
println("UIWebView.height: /(height)")
webView.setHeight(height: height)
let heightConstraint = NSLayoutConstraint(item: webView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Height, multiplier: 1.0, constant: height)
webView.addConstraint(heightConstraint)
// Set layout flag
webView.window?.setNeedsUpdateConstraints()
webView.window?.setNeedsLayout()
}
}
Use el siguiente código para hacer que su altura de UIWebView sea dinámica en Swift 3.x
func webViewDidFinishLoad(_ webView: UIWebView) {
let height = webView.scrollView.contentSize.height
var wRect = webView.frame
wRect.size.height = height
webView.frame = wRect
}
¡Así que esta es una gran función que escribiste allí, OP!
Aquí hay una versión más corta y elegante de su código:
//make sure to declare the delegate when creating your webView (add UIWebViewDelegate to class declaration as well)
myWebView.delegate = self
func webViewDidFinishLoad(webView: UIWebView) {
webView.frame.size.height = 1
webView.frame.size = webView.sizeThatFits(CGSizeZero)
}
Swift 3
myWebView.delegate = self
func webViewDidFinishLoad(_ webView: UIWebView) {
webView.frame.size.height = 1
webView.frame.size = webView.sizeThatFits(.zero)
}
esto solo funcionó para mí
func webViewDidFinishLoad(_ webView: UIWebView) {
webView.frame.size.height = 1
webView.frame.size = webView.sizeThatFits(.zero)
webView.scrollView.isScrollEnabled=false;
myWebViewHeightConstraint.constant = webView.scrollView.contentSize.height
webView.scalesPageToFit = true
}
asegúrese de haber creado una salida para myWebViewHeightConstraint
Cuando cambie la fuente en ese momento, cambie la altura de la vista Webview
a 1 antes de obtener la offsetHeight
adecuada. offsetHeight
para Webview
webView1.frame.size.height = 1
Puede usar esta clase para makking tamaño de vista web para adaptarse a swift 3 y swift 4
//
// RSWebView.swift
// CustumWebViewDemo
//
// Created by Ruchin Somal on 01/01/18.
// Copyright © 2018 Ruchin Somal. All rights reserved.
//
import UIKit
class RSWebView: UIWebView, UIWebViewDelegate {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.scrollView.isScrollEnabled = false
self.scrollView.bounces = false
self.delegate = self
}
override init(frame: CGRect) {
super.init(frame: frame)
self.scrollView.isScrollEnabled = false
self.scrollView.bounces = false
self.delegate = self
}
override func loadHTMLString(_ string: String?, baseURL: URL?) {
let s:String = "<html><head><title></title><meta name=/"viewport/" content=/"initial-scale=1, user-scalable=no, width=device-width/" /><link rel=/"stylesheet/" href=/"./webview.css/" ></link></head><body>"+string!+"</body></html>";
var url:URL
if baseURL == nil {
url = Bundle.main.bundleURL
} else {
url = baseURL!
}
super.loadHTMLString(s, baseURL: url)
}
func webViewDidFinishLoad(_ webView: UIWebView) {
self.webViewResizeToContent(webView: webView)
}
func webViewResizeToContent(webView: UIWebView) {
webView.layoutSubviews()
// Set to initial value of webview
var frame:CGRect = webView.frame
frame.size.height = 1.0
webView.frame = frame
// Calculated height of webview
let wvheight: CGFloat = webView.scrollView.contentSize.height
print("UIWebView.height: /(wvheight)")
var wvRect = webView.frame
wvRect.size.height = wvheight
webView.frame = wvRect
let heightConstraint = NSLayoutConstraint(item: webView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.height, multiplier: 1.0, constant: wvheight)
webView.addConstraint(heightConstraint)
webView.window?.setNeedsUpdateConstraints()
webView.window?.setNeedsLayout()
}
}