UIWebview 删除填充/边距

Posted

技术标签:

【中文标题】UIWebview 删除填充/边距【英文标题】:UIWebview remove padding / margin 【发布时间】:2016-08-06 18:14:24 【问题描述】:

我正在将 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)

但仍有填充或边距,看起来像这样:

我该如何解决这个问题?

我需要这个修复的原因是因为我将把这个 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()

【问题讨论】:

pdf 内容本身是否有可能被插入格式?无论如何,不​​要弄乱滚动视图框架。这无济于事,因为 Web 视图可能位于其父级的起源,否则将是有害的。我还猜想 YES 已经是 scalesPageToFit 的默认值。我能提供的最好的建设性想法是 webView.scrollView.contentInset。 你能把这个放在答案上吗 【参考方案1】:

将滚动视图框架设置为 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);

【讨论】:

这不起作用,我尝试了以下方法:webView.scrollView.contentInset = UIEdgeInsetsMake(10,-15,-10,-150); “没有工作”包含的信息很少。 和以前一样 内边距和边距保持不变。【参考方案2】:

这似乎解决了我的问题,不确定它与其他 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)
        
    

如果我做错了什么请告诉我

【讨论】:

【参考方案3】:

应用负面内容插图对我有用。这适用于 ios 11 和 10,在 Swift 4 上:

webView.scrollView.contentInset = UIEdgeInsets(top: -8, left: -8, bottom: -8, right: -8)

【讨论】:

【参考方案4】:

我不确定您是否找到了答案,但作为一种快速解决方法,您可以提供预先调整的约束。

假设你的填充空间是 10px 从所有 4 边,如果它总是一个常数

解决方法是:

为周围的 webView 留出 -10 的空间,同时不要忘记在没有 -10px 侧面约束的情况下向 webView 添加超级视图并标记超级视图

clipsToBounds = true 
clipSubViews = true 

【讨论】:

【参考方案5】:

此示例提供了 64 的顶部间距以允许导航栏。

let webView: UIWebView = UIWebView()

webView.frame = self.view.bounds

webView.scrollView.frame = webView.frame

webView.scrollView.contentInset = UIEdgeInsetsMake(64,0,0,0)

【讨论】:

【参考方案6】:

我不知道为什么我来这里这么多次,但谷歌从来没有让我通过实际回答的问题。对于任何有同样问题的人,这里是实际的答案:https://***.com/a/2442859/3393964

问题是浏览器添加了默认边距,一个简单的解决方法是添加:

body  margin: 0; padding: 0; 

【讨论】:

就我而言,我这样做了,但第一个元素是&lt;p&gt;,默认情况下有margin-top。可能最好添加使用 CSS 重置并明确设置所有内容。

以上是关于UIWebview 删除填充/边距的主要内容,如果未能解决你的问题,请参考以下文章

从 Google 图表中删除填充或边距

Bootstrap - 当屏幕尺寸较小时删除填充或边距

如何在 android 的 Tabwidget 中删除填充或边距?

Bootstrap - 当屏幕尺寸较小时删除图形的填充或边距

如何在Android中删除ActionBar中的左侧填充边距额外空间?

如何正确删除Android中按钮周围的填充(或边距?)?