54

我正在使用UIWebView来呈现一些 HTML。但是,虽然我的 webview 的宽度是 320,但我的 HTML 仍然显示为全宽并且可以水平滚动。

我想实现与本机邮件应用程序相同的东西,即它适合该宽度内的所有内容而不缩小 - 本机邮件应用程序如何呈现这样的 HTML?

更新

我认为使用视口元标记会有所帮助,但我无法让它工作。

这是正在发生的事情:

在此处输入图像描述

如您所见,内容不适合设备宽度。我已经尝试了很多viewport元标记的组合。以下是我尝试 Martins 建议时发生的情况的示例。

可以在此处找到原始 HTML 。

本机邮件应用程序呈现此 HTML 的方式是这样的。

4

8 回答 8

133

这是你要做的:

在拥有 Web 视图的 UI 控制器中,将其设为UIWebViewDelegate. 然后在设置要加载的 URL 的地方,将委托设置为控制器:

NSString *urlAddress = @"http://dl.dropbox.com/u/50941418/2-build.html";
NSURL *url = [NSURL URLWithString:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];  
webView.delegate = self;

最后实现webViewDidFinishLoad:正确设置缩放级别:

此选项适用于 iOS 5.0 和 >

- (void)webViewDidFinishLoad:(UIWebView *)theWebView
{
  CGSize contentSize = theWebView.scrollView.contentSize;
  CGSize viewSize = theWebView.bounds.size;

  float rw = viewSize.width / contentSize.width;

  theWebView.scrollView.minimumZoomScale = rw;
  theWebView.scrollView.maximumZoomScale = rw;
  theWebView.scrollView.zoomScale = rw;  
}

我希望这有帮助...

选项 B,您可以尝试更改 HTML(此示例可以完成工作,但从 HTML 解析的角度来看并不完美。我只是想说明我的观点。它确实适用于您的示例,并且可能适用于大多数情况。 40 可能可以通过编程方式检测到,我没有尝试对此进行研究。

NSString *urlAddress = @"http://dl.dropbox.com/u/50941418/2-build.html";
NSURL *url = [NSURL URLWithString:urlAddress];

NSString *html = [NSString stringWithContentsOfURL:url encoding:[NSString defaultCStringEncoding] error:nil];
NSRange range = [html rangeOfString:@"<body"];

if(range.location != NSNotFound) {
  // Adjust style for mobile
  float inset = 40;
  NSString *style = [NSString stringWithFormat:@"<style>div {max-width: %fpx;}</style>", self.view.bounds.size.width - inset];
  html = [NSString stringWithFormat:@"%@%@%@", [html substringToIndex:range.location], style, [html substringFromIndex:range.location]];
}

[webView loadHTMLString:html baseURL:url];
于 2012-05-22T13:00:02.650 回答
57

只需添加以下内容:

webView.scalesPageToFit = YES;
于 2013-03-06T06:41:42.750 回答
6

通常,您应该使用视口元标记。但是它的使用非常不稳定,主要是如果你想要一个跨平台的网页。

这也取决于你有什么内容和CSS。

对于我的 iPhone 主页,它必须从纵向自动调整为横向,我使用这个:

<meta name="viewport" content="width=device-width; minimum-scale=1.0; maximum-scale=1.0; user-scalable=no">

如果您需要特殊调整大小,也可以使用事件:

<body onorientationchange="updateOrientation();">

在您的 javascript 中使用相应的功能:

function updateOrientation() {
  if(Math.abs(window.orientation)==90)
      // landscape
  else
      // portrait   
}

编辑 :

看到您的页面源代码,似乎您是使用网络编辑器制作的,不是吗?

好的,我明白了。您的主 div 的宽度为 600 像素。iphone屏幕分辨率为320x480。600 > 320 所以它超出了屏幕边界。

现在,让我们做一些简单的操作:

320 / 600 = 0.53
480 / 600 = 0.8

因此,您希望最小缩小 0.5 倍,最大缩小 0.8 倍。让我们改变视口:

<meta name="viewport" content="width=device-width; minimum-scale=0.5; maximum-scale=0.8; user-scalable=no"> 
于 2012-05-22T09:50:09.100 回答
5

对我有用的是在 Interface Builder 中选择 UIWebView 并选中“Scales Page To Fit”框:

在此处输入图像描述

于 2013-11-01T21:20:37.763 回答
1
@implementation UIWebView (Resize)

- (void)sizeViewPortToFitWidth {
    [self stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.querySelector('meta[name=\"viewport\"]').setAttribute('content', 'width=%d;', false); ", (int)self.frame.size.width]];
}

@end
于 2015-07-29T13:45:18.237 回答
1

斯威夫特 3:

使用此扩展可以根据 webview 的大小调整 webview 内容的大小。

extension UIWebView {
    ///Method to fit content of webview inside webview according to different screen size
    func resizeWebContent() {
        let contentSize = self.scrollView.contentSize
        let viewSize = self.bounds.size
        let zoomScale = viewSize.width/contentSize.width
        self.scrollView.minimumZoomScale = zoomScale
        self.scrollView.maximumZoomScale = zoomScale
        self.scrollView.zoomScale = zoomScale
    }
}

如何调用?

webViewOutlet.resizeWebContent()
于 2016-11-29T10:40:28.237 回答
0

您可以NSAttributedString从 HTML 生成一个(在后台执行):

@implementation NSAttributedString (Utils)

+ (void)parseHTML:(NSString *)html withCompletion:(void (^)(NSAttributedString *completion, NSError *error))completion
{
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        NSError * __autoreleasing *error = nil;
        NSAttributedString *result = [[NSAttributedString alloc] initWithData:[html dataUsingEncoding:NSUTF8StringEncoding]
                                                                      options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                                NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
                                                           documentAttributes:nil error:error];
        NSError *safeError = (error != nil) ? *error : nil;
        dispatch_sync(dispatch_get_main_queue(), ^(void){
            completion(result, safeError);
        });
    });
}

@end

并通过UITextView实例展示它:

[NSAttributedString parseHTML:htmlString withCompletion:^(NSAttributedString *parseResult, NSError *error) {
        bodyTextView.attributedText = parseResult;
}];

但是,某些布局功能可能会因这种方法而损坏。

于 2018-01-30T21:44:28.147 回答
0

我通过取消勾选“缩放页面以适应”解决了这个问题 在此处输入图像描述

于 2020-02-17T14:09:36.590 回答