`

UIWebView自适应宽度

    博客分类:
  • iOS
 
阅读更多
  webview在手机上显示的内容经常非常宽,显示出来之后要手动缩放才能正常浏览。但如果用
[self.webView setScalesPageToFit:YES];

则会被居中缩放的非常小,如图:



(请无视我demo里的title。。。)


  其实html本身有一个缩放的方法,可以在<head>里加一个节点:

<meta name="viewport" content="initial-scale=1.0, minimum-scale=0.1, maximum-scale=2.0, user-scalable=yes\">


content里规定了这个界面:
最小缩放比例是0.1:minimum-scale=0.1
最大缩放比例是2.0:maximum-scale=2.0
允许用户缩放:user-scalable=yes
当前缩放比是1.0:initial-scale=1.0


因此我们可以通过计算initial-scale来决定页面显示的时候缩放到什么比例是正好充满屏幕宽。

可以通过js获取body的实际宽度:
document.body.scrollWidth


然后根据我们自己webview的宽度,就可以得到期待的initial-scale了:webViewwebView.frame.size.width/pageWidth;

下边来说具体怎么在iOS项目中实现:

第一步:js必须是在html加载完成后才能调用,因此在iOS项目中,需要先载入一次原始的html:

    //html是否加载完成
    isLoadingFinished = NO;
    
    //这里一定要设置为NO
    [self.webView setScalesPageToFit:NO];
    
    [self.webView loadHTMLString:currentMail.htmlBody baseURL:nil];
    
    //第一次加载先隐藏webview
    [self.webView setHidden:YES];
    
    self.webView.delegate = self;


第二步:第一次载入偷偷载入完成后,在代理里边调用js获取宽度,然后算出合适的缩放比例,并在<head>里加上我们需要的<meta>,然后再将新的html重新加载,加载完成后再显示:
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    //若已经加载完成,则显示webView并return
    if(isLoadingFinished)
    {
        [self.webView setHidden:NO];
        return;
    }
    
    //js获取body宽度
    NSString *bodyWidth= [webView stringByEvaluatingJavaScriptFromString: @"document.body.scrollWidth "];
    
    int widthOfBody = [bodyWidth intValue];
    
    //获取实际要显示的html
    NSString *html = [self htmlAdjustWithPageWidth:widthOfBody
                                              html:currentMail.htmlBody
                                           webView:webView];
    
    //设置为已经加载完成
    isLoadingFinished = YES;
    //加载实际要现实的html
    [self.webView loadHTMLString:html baseURL:nil];
}

//获取宽度已经适配于webView的html。这里的原始html也可以通过js从webView里获取
- (NSString *)htmlAdjustWithPageWidth:(CGFloat )pageWidth
                                 html:(NSString *)html
                              webView:(UIWebView *)webView
{
    NSMutableString *str = [NSMutableString stringWithString:html];
    //计算要缩放的比例
    CGFloat initialScale = webView.frame.size.width/pageWidth;
    //将</head>替换为meta+head
    NSString *stringForReplace = [NSString stringWithFormat:@"<meta name=\"viewport\" content=\" initial-scale=%f, minimum-scale=0.1, maximum-scale=2.0, user-scalable=yes\"></head>",initialScale];
    
    NSRange range =  NSMakeRange(0, str.length);
    //替换
    [str replaceOccurrencesOfString:@"</head>" withString:stringForReplace options:NSLiteralSearch range:range];
    return str;
}


效果如下:



  • 大小: 152.7 KB
  • 大小: 169.4 KB
4
0
分享到:
评论
1 楼 Joyceitoyo 2015-12-23  
我试了怎么不好使,着急找中, 希望给与帮助  2219221403

相关推荐

    iOS WKWebView和UIWebView自适应高度

    在处理自适应高度时,UIWebView有一个`estimatedContentHeight`属性,但这个属性并不总是准确,因此通常我们需要监听`UIWebView`的`webViewDidFinishLoad:`代理方法。在这个方法中,可以通过`...

    iOS WKWebView和UIWebView高度自适应

    对于高度自适应,我们可以监听`UIWebView`的`webViewDidFinishLoad:`代理方法,在此方法中通过调用`stringByEvaluatingJavaScriptFromString:`执行JavaScript代码来获取网页的实际内容高度,然后设置`webView`的`...

    UIWebViewDemo

    **UIWebViewDemo** 是一个基于iOS开发的示例项目,主要展示了如何在应用程序中使用`UIWebView`组件来加载和展示网页内容。`UIWebView`是Apple提供的原生控件,它允许iOS开发者在应用内嵌入网页浏览功能,使得用户...

    iPhone开发之UIWebView示例程序

    在iOS应用开发中,UIWebView是一个非常重要的组件,它允许开发者在应用程序内嵌入网页内容,实现网页浏览功能。这个示例程序是针对iPhone平台,旨在帮助开发者理解如何有效地使用UIWebView来展示网页数据。通过这个...

    UIWebView和js交互

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于展示网页内容。它可以加载HTML、CSS和JavaScript代码,并且支持与JavaScript进行交互,从而实现原生应用和Web内容的融合。本教程将深入探讨UIWebView与...

    IOS UIWebView Demo

    【标题】:“IOS UIWebView Demo”是一个iOS应用开发中的实例,它主要展示了如何在iOS应用中集成和使用UIWebView组件来加载和展示网页内容。UIWebView是Apple iOS SDK提供的一种原生控件,用于在iOS应用程序内部显示...

    Cocos2dx中UIWebView替换为WKWebView

    然而,随着Apple对App Store审核政策的调整,使用UIWebView的App将不再被接受,因为Apple已经将其列为弃用API。在2020年,Apple明确表示,自2020年12月起,所有新提交的App和更新都必须移除UIWebView的使用,转而...

    UIWebView+html+css

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于展示网页内容。这个话题“UIWebView+html+css”主要关注如何在UIWebView中嵌入HTML和CSS,实现可点击的链接以及显示动态的GIF动画效果。下面将详细讲解这个...

    UIWebView和js交互demo1

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于展示网页内容。它可以加载HTML、CSS和JavaScript代码,并且具有与Objective-C(OC)代码进行交互的能力。本项目"UIWebView和js交互demo1"就是展示了如何利用...

    UIWebView的使用

    在iOS开发中,UIWebView是苹果提供的一种非常重要的组件,它允许开发者在应用程序内部嵌入网页内容,实现类似浏览器的功能。这个"UIWebView的使用"示例是一个基础的学习项目,旨在帮助开发者理解如何通过UIWebView...

    UIWebView的使用代码

    之前提到UIWebView使用一个UIScrollView对象来关联web页面的内容,通过UIWebView的scrollView属性即可获得该对象,默认情况下网页长度超出设备视口长度后页面会滚动,用户使用手指滚动页面到页面边距并放开手指后...

    UIWebView使用

    在iOS开发中,UIWebView是苹果提供的一种非常重要的组件,用于在原生应用中嵌入网页内容。这个组件使得开发者可以展示HTML、CSS和JavaScript编写的网页,甚至与应用程序进行交互,实现一定的混合开发模式。以下是对...

    网页视图 UIWebView

    在本文中,我们将深入探讨UIWebView的基本使用,包括网络资源地址字符串的处理以及UIWebView的属性和协议的综合应用。 首先,让我们了解一下**UIWebView的基本使用**。创建一个UIWebView实例很简单,只需要在代码中...

    UIWebView与 javascript的交互

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于在应用内展示网页内容。这个"UIWebView与javascript的交互"的标题暗示了我们正在探讨如何在iOS应用中利用UIWebView与嵌入的HTML页面进行双向通信,即通过...

    UIWebView原生与H5交互

    在iOS开发中,UIWebView是苹果提供的一种组件,用于在应用程序中展示网页内容。它不仅可以加载HTML页面,还可以执行JavaScript代码,甚至与原生代码进行交互。这种交互性使得开发者可以利用HTML、CSS和JavaScript的...

    Demo.zip_DEMO_iphone_uiwebview_uiwebview demo_uiwebview video

    "Demo.zip_DEMO_iphone_uiwebview_uiwebview demo_uiwebview video"这个标题暗示了我们正在讨论的是一个关于在iPhone应用中使用UIWebView播放视频的示例项目。 UIWebView是Apple提供的一个类,它是UIKit框架的一...

    UIWebView Demo代码

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于在应用程序内展示网页内容。这个"UIWebView Demo代码"示例旨在帮助开发者理解如何使用UIWebView来加载和交互网页。下面我们将深入探讨UIWebView的主要功能、...

    UIWebView加载html

    在iOS开发中,UIWebView是苹果提供的一种用于在应用程序中展示网页内容的组件。这篇博客“UIWebView加载html”很可能是讨论如何利用UIWebView来加载并显示HTML代码,这对于构建混合式应用或者需要在App内嵌入网页...

    自适应文本内容的label

    对于Label,可以设置相关的约束,如最小宽度、最大宽度,以及与父视图或其他视图的关系,以便自动扩展或收缩。 2. **Dynamic Type**:苹果的Dynamic Type允许用户自定义字体大小,这对有视觉障碍的用户非常友好。...

Global site tag (gtag.js) - Google Analytics