我正在使用UIWebView
来呈现一些HTML。但是,虽然我的webview的宽度是320,但我的HTML仍然显示为全宽,可以水平滚动。
我想实现本机邮件应用程序实现的相同功能,即它适合该宽度内的所有内容而不缩小 - 本机邮件应用程序如何呈现这样的HTML?
我认为使用视口元标记会有所帮助,但我无法使其工作。
这就是发生的事情:
如您所见,内容不适合设备宽度。我已经尝试了很多viewport
元标记的组合。下面是我尝试Martins建议时会发生什么的一个例子。
可以找到原始HTML here。
native mail application is like so呈现此HTML的方式。
答案 0 :(得分:130)
这是你做的:
在拥有网络视图的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];
答案 1 :(得分:57)
只需添加:
webView.scalesPageToFit = YES;
答案 2 :(得分:5)
通常,您应该使用视口元标记。但它的使用非常不稳定,主要是如果你想要一个跨平台的网页。
它还取决于您拥有的内容和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宽度为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">
答案 3 :(得分:5)
对我来说有用的是在Interface Builder中选择UIWebView并选中“Scales Page To Fit”框:
答案 4 :(得分: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
答案 5 :(得分:1)
斯威夫特3:
使用此扩展程序根据网页视图的大小调整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()
答案 6 :(得分:0)
您可以从HTML生成<Row onClick={this.handleChange} >
<Col s={12}>
<Col s={4} style={{marginTop: '80px'}}>
<Col s={12}>
<Col s={3} className='center'><Button type="button" value="endangered" name="cause" floating={true} className={(this.state.cause === 'endangered') ? 'green' : 'blue'} style={radioStyle}/></Col>
<Col s={9}><label>Endagered Animals & Wildlife</label></Col>
</Col>
<Col s={12}>
<Col s={3} className='center'><Button type="button" value="microplastics" name="cause" floating={true} className={(this.state.cause === 'microplastics') ? 'green' : 'blue'} style={radioStyle}/></Col>
<Col s={9}><label>Microplastics & Ocean Pollution</label></Col>
</Col>
<Col s={12}>
<Col s={3} className='center'><Button type="button" value="carbon" name="cause" floating={true} className={(this.state.cause === 'carbon') ? 'green' : 'blue'} style={radioStyle}/></Col>
<Col s={9}><label>Carbon Deposits & Emission</label></Col>
</Col>
<Col s={12}>
<Col s={3} className='center'><Button type="button" value="other" name="cause" floating={true} className={(this.state.cause === 'other') ? 'green' : 'blue'} style={radioStyle}/></Col>
<Col s={9}><label>Company SignUp</label></Col>
</Col>
</Col>
</Col>
</Row>
(在后台执行):
NSAttributedString
并通过@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
但是,某些布局功能可能会因此方法而损坏。
答案 7 :(得分:0)