Iphone HTML内容适合UIWebview,无需缩小
我正在使用Iphone HTML内容适合UIWebview,无需缩小,iphone,objective-c,uiwebview,Iphone,Objective C,Uiwebview,我正在使用UIWebView呈现一些HTML。然而,尽管我的webview的宽度是320,我的HTML仍然显示为全宽,并且可以水平滚动 我想实现与本机邮件应用程序实现的相同的功能,即在不缩小的情况下适合该宽度内的所有内容-本机邮件应用程序如何呈现这样的HTML 更新 我认为使用viewport meta标记会有所帮助,但我无法实现这一点 这就是正在发生的事情: 如您所见,内容与设备宽度不匹配。我尝试了很多viewportmeta标记的组合。下面是我尝试Martin建议时发生的一个例子 可以找到
UIWebView
呈现一些HTML。然而,尽管我的webview的宽度是320,我的HTML仍然显示为全宽,并且可以水平滚动
我想实现与本机邮件应用程序实现的相同的功能,即在不缩小的情况下适合该宽度内的所有内容-本机邮件应用程序如何呈现这样的HTML
更新
我认为使用viewport meta标记会有所帮助,但我无法实现这一点
这就是正在发生的事情:
如您所见,内容与设备宽度不匹配。我尝试了很多viewport
meta标记的组合。下面是我尝试Martin建议时发生的一个例子
可以找到原始HTML
此HTML由.呈现的方式通常应使用viewport meta标记。但是它的使用非常不稳定,主要是当你想要一个跨平台的网页时 这也取决于你有什么内容和css 对于我的iPhone主页,它必须从纵向自动调整到lanscape,我使用以下方法:
<meta name="viewport" content="width=device-width; minimum-scale=1.0; maximum-scale=1.0; user-scalable=no">
编辑:
看到你的网页源代码,看起来你是用一个网页编辑器做的,不是吗
好的,我明白了。您的主div的宽度为600px。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">
以下是您要做的:
在拥有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];
NSString*urlAddress=@”http://dl.dropbox.com/u/50941418/2-build.html";
NSURL*url=[NSURL URLWithString:urlAddress];
NSString*html=[NSString stringWithContentsOfURL:url编码:[NSString defaultCStringEncoding]错误:nil];
NSRange range=[html rangeOfString:@“只需添加以下内容:
webView.scalesPageToFit = YES;
对我来说,有效的方法是在Interface Builder中选择UIWebView并选中“根据需要缩放页面”的框:
Swift 3:
使用此扩展可以根据webview的大小调整webview内容的大小
如何调用?
webViewOutlet.resizeWebContent()
您可以从HTML生成NSAttributedString
(在后台执行):
并通过UITextView
实例显示:
[NSAttributedString parseHTML:htmlString withCompletion:^(NSAttributedString *parseResult, NSError *error) {
bodyTextView.attributedText = parseResult;
}];
但是,某些布局功能可能会因这种方法而损坏。我通过取消勾选“根据需要缩放页面”解决了这个问题
使用最小宽度和高度以及最小和最大宽度的div标签填充内容,并根据父项进行相应调整content@safecase这不是一个HTML解决方案。我需要使用objective-c或iPhone情节提要或uiwebview配置来实现这一点。您的网页是针对iPhone的,还是共享移动和非移动用户?see我的编辑,我想这只是一个视口问题。在显示页面之前,捕获html内容并在html正文标记中添加一个width=320px。我有一个类似的问题,这是解决问题的唯一方法。谢谢你的回答。但我尝试了上面的元标记,但它不起作用。请参阅我的问题更新,我尝试了新的viewport meta标记,它似乎完全实现了mprivat answer的功能。但是,仍然存在一个问题。请参阅我对mprivat答案的评论。此外,该应用程序应该采用不同的HTML,并以与本机邮件应用程序相同的方式呈现,因此我不确定计算是否适用于所有HTML电子邮件。usi呢ng Javascript使文本变大?当页面完成加载调用后,可以使用:-(NSString*)stringByEvaluatingJavaScriptFromString:(NSString*))脚本
webview方法非常感谢您的回答。因此我刚刚尝试了这个方法,效果更好。但是,实际情况是,内容适合设备屏幕的宽度。但是文本很小。本机邮件应用程序在保持设备固定宽度的同时以某种方式缩放文本和其他元素。有什么想法吗?这是这是本机邮件应用程序显示同一封电子邮件的方式:我明白你的意思。不幸的是,这只能通过修改HTML来实现。你可以从屏幕截图中看到,这并不是在图形级别实现的,因为它不是完全成比例的。这是因为邮件应用程序可能会改变样式。我在回答中添加了选项B以查看h如何做到这一点(不要忘记删除此选项的代理,否则它也会尝试缩放)@mprivate是的,这似乎有效!你能告诉我更多关于逻辑的信息吗。你是在添加一个新的样式块来设置所有div的最大宽度吗?如果是的话,如果有纯表布局的HTML,这仍然有效吗?还是我误解了?是的,这只是设置div的上限。我怀疑相同的样式属性可以应用于e HTML body tag。我不想说实话,但我记得我读到过你可以。我猜你需要对样式进行一些调整,以支持所有类型的HTML布局,但我相信你得到了基本的想法。它是有效的,因为我没有选中“缩放页面以适应”的值“谢谢你这对我来说效果更好,它没有像公认的答案那样页面高度过大的问题。只是找到了这个,它让我免于数小时的沮丧。”
@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
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()
@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
[NSAttributedString parseHTML:htmlString withCompletion:^(NSAttributedString *parseResult, NSError *error) {
bodyTextView.attributedText = parseResult;
}];