UIWebview 删除填充/边距
UIWebview remove padding / margin
我正在将 PDF 加载到 UIWebview
中,我将背景颜色更改为透明,并将不透明设置为 false。但是现在我想删除 UIWebView
中的填充或边距,所以 UIWebview
是屏幕。
我创建了一个 UIWebview
像这样:
let webview = UIWebView()
webview.frame = self.view.bounds
webview.scrollView.frame = webview.frame
webview.userInteractionEnabled = true
webview.scalesPageToFit = true
webview.becomeFirstResponder()
webview.delegate = self
webview.scrollView.delegate = self
webview.opaque = false
webview.backgroundColor = UIColor.clearColor()
self.view.addSubview(webview)
webview.loadRequest(NSURLRequest(URL:url))
webview.gestureRecognizers = [pinchRecognizer, panRecognizer]
我将其应用于 webViewDidFinishLoad 方法
func webViewDidFinishLoad(webView: UIWebView) {
let padding = "document.body.style.margin='0';document.body.style.padding = '0'"
webView.stringByEvaluatingJavaScriptFromString(padding)
}
但是还是有padding或者margin,看起来像这样:
我该如何解决这个问题?
我需要这个修复的原因是因为我要将这个 UIWebView 保存为 PDF,当我保存它时,还有额外的间距,这是我的 PDF 生成代码:
func drawPDFUsingPrintPageRenderer(printPageRenderer: UIPrintPageRenderer) -> NSData! {
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, CGRectZero, nil)
UIGraphicsBeginPDFPage()
printPageRenderer.drawPageAtIndex(0, inRect: UIGraphicsGetPDFContextBounds())
UIGraphicsEndPDFContext()
return data
}
以及更多
let screenHeight = appDelegate.webview!.scrollView.bounds.size.height
let heightStr = appDelegate.webview!.scrollView.bounds.size.height
let height = heightStr
let pages = ceil(height / screenHeight)
let pdfMutableData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfMutableData, appDelegate.webview!.scrollView.bounds, nil)
for i in 0..<Int(pages)
{
if (CGFloat((i+1)) * screenHeight > CGFloat(height)) {
var f = appDelegate.webview!.scrollView.frame
f.size.height -= ((CGFloat((i+1)) * screenHeight) - CGFloat(height));
appDelegate.webview!.scrollView.frame = f
}
UIGraphicsBeginPDFPage()
let currentContext = UIGraphicsGetCurrentContext()
appDelegate.webview!.scrollView.setContentOffset(CGPointMake(0, screenHeight * CGFloat(i)), animated: false)
appDelegate.webview!.scrollView.layer.renderInContext(currentContext!)
}
UIGraphicsEndPDFContext()
当 Web 视图位于原点时,将滚动视图框架设置为 Web 视图框架将无效,否则会产生不需要的效果。
调整滚动视图contentInset
:
// set t,l,b,r to be negative CGFloat values that suit your content
webView.scrollView.contentInset = UIEdgeInsetsMake(t,l,b,r);
这似乎解决了我的问题,但不确定它与其他 PDF 文档(纵向)的配合情况如何。我的是横向,但效果很好。
appDelegate.webview = UIWebView()
appDelegate.webview!.frame = CGRect(x: 0 - 8, y: 0 - 8, width: self.view.bounds.size.width + 14, height: self.view.bounds.size.height + 14)
appDelegate.webview!.scrollView.frame = CGRect(x: 0 - 8, y: 0 - 8, width: self.view.bounds.size.width + 14, height: self.view.bounds.size.height + 14)
然后保存 PDF
func createPdfFromView(aView: UIView, saveToDocumentsWithFileName fileName: String)
{
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: 0 + 8, y: 0 - 8, width: aView.bounds.size.width - 17, height: aView.bounds.size.height - 117), nil)
UIGraphicsBeginPDFPage()
guard let pdfContext = UIGraphicsGetCurrentContext() else { return }
aView.layer.renderInContext(pdfContext)
UIGraphicsEndPDFContext()
if let documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first {
let documentsFileName = documentDirectories + "/" + fileName
debugPrint(documentsFileName)
pdfData.writeToFile(documentsFileName, atomically: true)
}
}
如果我做错了什么请告诉我
我不确定您是否找到了答案,但作为快速解决方法,您可以提供预先调整的约束条件。
假设你的 padding space 从所有 4 个边都是 10px 并且它是否总是一个常数
解决方法是:
为它周围的 webView 提供 -10 space,同时不要忘记在没有 -10px 边约束的情况下向你的 webView 添加一个 superview 并标记 superview
clipsToBounds = true
clipSubViews = true
此示例给出了 64 的顶部间距以允许导航栏。
let webView: UIWebView = UIWebView()
webView.frame = self.view.bounds
webView.scrollView.frame = webView.frame
webView.scrollView.contentInset = UIEdgeInsetsMake(64,0,0,0)
应用负面内容插图对我很有用。这适用于 iOS 11 和 10,适用于 Swift 4:
webView.scrollView.contentInset = UIEdgeInsets(top: -8, left: -8, bottom: -8, right: -8)
我不知道为什么我来这里这么多次,但 google 从来没有让我进入实际回答的问题。对于遇到同样问题的人,这里是实际答案:
The problem is that browsers add a default margin, a simple fix is adding this:
body { margin: 0; padding: 0; }
我正在将 PDF 加载到 UIWebview
中,我将背景颜色更改为透明,并将不透明设置为 false。但是现在我想删除 UIWebView
中的填充或边距,所以 UIWebview
是屏幕。
我创建了一个 UIWebview
像这样:
let webview = UIWebView()
webview.frame = self.view.bounds
webview.scrollView.frame = webview.frame
webview.userInteractionEnabled = true
webview.scalesPageToFit = true
webview.becomeFirstResponder()
webview.delegate = self
webview.scrollView.delegate = self
webview.opaque = false
webview.backgroundColor = UIColor.clearColor()
self.view.addSubview(webview)
webview.loadRequest(NSURLRequest(URL:url))
webview.gestureRecognizers = [pinchRecognizer, panRecognizer]
我将其应用于 webViewDidFinishLoad 方法
func webViewDidFinishLoad(webView: UIWebView) {
let padding = "document.body.style.margin='0';document.body.style.padding = '0'"
webView.stringByEvaluatingJavaScriptFromString(padding)
}
但是还是有padding或者margin,看起来像这样:
我该如何解决这个问题?
我需要这个修复的原因是因为我要将这个 UIWebView 保存为 PDF,当我保存它时,还有额外的间距,这是我的 PDF 生成代码:
func drawPDFUsingPrintPageRenderer(printPageRenderer: UIPrintPageRenderer) -> NSData! {
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, CGRectZero, nil)
UIGraphicsBeginPDFPage()
printPageRenderer.drawPageAtIndex(0, inRect: UIGraphicsGetPDFContextBounds())
UIGraphicsEndPDFContext()
return data
}
以及更多
let screenHeight = appDelegate.webview!.scrollView.bounds.size.height
let heightStr = appDelegate.webview!.scrollView.bounds.size.height
let height = heightStr
let pages = ceil(height / screenHeight)
let pdfMutableData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfMutableData, appDelegate.webview!.scrollView.bounds, nil)
for i in 0..<Int(pages)
{
if (CGFloat((i+1)) * screenHeight > CGFloat(height)) {
var f = appDelegate.webview!.scrollView.frame
f.size.height -= ((CGFloat((i+1)) * screenHeight) - CGFloat(height));
appDelegate.webview!.scrollView.frame = f
}
UIGraphicsBeginPDFPage()
let currentContext = UIGraphicsGetCurrentContext()
appDelegate.webview!.scrollView.setContentOffset(CGPointMake(0, screenHeight * CGFloat(i)), animated: false)
appDelegate.webview!.scrollView.layer.renderInContext(currentContext!)
}
UIGraphicsEndPDFContext()
当 Web 视图位于原点时,将滚动视图框架设置为 Web 视图框架将无效,否则会产生不需要的效果。
调整滚动视图contentInset
:
// set t,l,b,r to be negative CGFloat values that suit your content
webView.scrollView.contentInset = UIEdgeInsetsMake(t,l,b,r);
这似乎解决了我的问题,但不确定它与其他 PDF 文档(纵向)的配合情况如何。我的是横向,但效果很好。
appDelegate.webview = UIWebView()
appDelegate.webview!.frame = CGRect(x: 0 - 8, y: 0 - 8, width: self.view.bounds.size.width + 14, height: self.view.bounds.size.height + 14)
appDelegate.webview!.scrollView.frame = CGRect(x: 0 - 8, y: 0 - 8, width: self.view.bounds.size.width + 14, height: self.view.bounds.size.height + 14)
然后保存 PDF
func createPdfFromView(aView: UIView, saveToDocumentsWithFileName fileName: String)
{
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: 0 + 8, y: 0 - 8, width: aView.bounds.size.width - 17, height: aView.bounds.size.height - 117), nil)
UIGraphicsBeginPDFPage()
guard let pdfContext = UIGraphicsGetCurrentContext() else { return }
aView.layer.renderInContext(pdfContext)
UIGraphicsEndPDFContext()
if let documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first {
let documentsFileName = documentDirectories + "/" + fileName
debugPrint(documentsFileName)
pdfData.writeToFile(documentsFileName, atomically: true)
}
}
如果我做错了什么请告诉我
我不确定您是否找到了答案,但作为快速解决方法,您可以提供预先调整的约束条件。
假设你的 padding space 从所有 4 个边都是 10px 并且它是否总是一个常数
解决方法是:
为它周围的 webView 提供 -10 space,同时不要忘记在没有 -10px 边约束的情况下向你的 webView 添加一个 superview 并标记 superview
clipsToBounds = true
clipSubViews = true
此示例给出了 64 的顶部间距以允许导航栏。
let webView: UIWebView = UIWebView()
webView.frame = self.view.bounds
webView.scrollView.frame = webView.frame
webView.scrollView.contentInset = UIEdgeInsetsMake(64,0,0,0)
应用负面内容插图对我很有用。这适用于 iOS 11 和 10,适用于 Swift 4:
webView.scrollView.contentInset = UIEdgeInsets(top: -8, left: -8, bottom: -8, right: -8)
我不知道为什么我来这里这么多次,但 google 从来没有让我进入实际回答的问题。对于遇到同样问题的人,这里是实际答案:
The problem is that browsers add a default margin, a simple fix is adding this:
body { margin: 0; padding: 0; }