example app swift uiwebview

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() } }