放大UIWebView

我有一个UIWebView ,我正在使用它来显示各种各样的内容,有时HTML和有时PDF / Powerpoint /等(这似乎是由相同的底层控制处理)。

我想要做的就是利用底层的UIScrollViewUIWebView的子视图)捕获滚动视图的确切透视图,并在另一个UIWebView重新创build滚动位置,从而保持它们同步。

我遇到的问题是显示HTML内容时(尽pipe显示PDF内容时, zoomScale是正确的), UIScrollViewzoomScale属性始终为1.0

我设法发现,我可以得到一个HTML页面的缩放比例的唯一的地方是在scrollViewDidEndZooming:withView:atScale:委托方法。 我发现atScale:参数似乎提供了一个相对的缩放比例,缩放比例是在缩放操作开始之前的。 因此,例如,当放大时,该参数> 1,当缩小时<1,它似乎是两个缩放比例之间的相对值,而不是绝对缩放比例)。

我进一步发现的是,从根本上讲,HTML和PDF内容由两个不同的底层视图处理: UIWebBrowserView处理HTML内容, UIWebPDFView处理PDF的显示。

换句话说,当使用UIWebPDFViewUIScrollViewzoomScale属性是完全可靠的(例如, 1.0缩小, 2.4放大)。 另一方面, UIWebBrowserView更加繁琐,当询问UIScrollViewzoomScale ,总是返回1.0 ,但是当接收到委托callback时,会收到一个相对值的比例值。

所以我的问题是:

  1. 这是一个错误? (从我所见过的iOS 4和5上都可以看到这种行为)。

  2. 我怎样才能同时获得HTML和PDF内容的zoomScale (或其他一些属性/属性),并且可以将状态复制并与另一个UIWebView保持同步。

我并不赞成使用zoomScale ,所以我打开其他build议如何在另一个UIWebView上捕获和再现UIWebView的滚动状态。

当加载HTML和UIWebBrowserView正在使用时,您可以使用

zoomScale = 1.0 / webView.scrollView.minimumZoomScale

当然,这是假定您可以可靠地确保您的HTML页面的最小缩放比例为1.0,因为有些页面可以使用“视口”元标记更改最小缩放比例。

你尝试过吗?

 set scalesPageToFit=YES; 

这是处理我认为的问题最常见的方法。 设置,使您捏和缩放UIWebView.I不认为你可以放大/缩小UIWebView没有。

现在缩放将与你在UIWebView上显示的内容有关。 如果它是一张大桌子,它不是那么接近,但如果你要捏缩放,这是一个很好的起点。

这个缩放UIWebView的逻辑,不需要在UIScrollView上添加UIWebView

那么唯一的问题是webView.scalesPageToFit=YES; 是,它改变了初始内容的字体大小,但我有我自己的其他select,它对我的​​工作很好。

<UIWebViewDelegate, UIScrollViewDelegate>添加到您的.h文件

创build你的UIWebView.

 self.mWebview = [[UIWebView alloc] init]; self.mWebview.delegate = self; /// set delegate method of UIWebView self.mWebview.frame = CGRectMake(0, 35, self.view.bounds.size.width, self.view.bounds.size.height - 80); // set frame whatever you want.. [self.mWebview setOpaque:NO]; self.mWebview.backgroundColor = [UIColor clearColor]; [self.view addSubview:self.mWebview]; 

加载HTML文件/内容。

 NSString* htmlString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"File Name"ofType:@"html"] encoding:NSUTF8StringEncoding error:nil]; [self.mWebview loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; #pragma mark - #pragma mark - Webview Delegate Methods - (void) webViewDidFinishLoad:(UIWebView *)webView { webView.scrollView.delegate = self; // set delegate method of UISrollView webView.scrollView.maximumZoomScale = 20; // set as you want. webView.scrollView.minimumZoomScale = 1; // set as you want. //// Below two line is for iOS 6, If your app only supported iOS 7 then no need to write this. webView.scrollView.zoomScale = 2; webView.scrollView.zoomScale = 1; } #pragma mark - #pragma mark - UIScrollView Delegate Methods - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { self.mWebview.scrollView.maximumZoomScale = 20; // set similar to previous. } 

注意:我必须在Mac OS X – 10.9.3上使用Xcode 5.1.1和iOS 6.1以及后者进行testing。

我希望这会对你有所帮助。 🙂

不幸的是,我发现在UIWebView中获取Web内容的实际比例的唯一方法是访问UIWebBrowserView:initialScale的私有成员。

 float initialScale = (access to [UIWebBrowserView initialScale]) float zoomScale = 1.0 / webView.scrollView.minimumZoomScale; float actualScale = zoomScale * initialScale; 

我想知道如果这可以做到不访问私人会员。

这可能有点晚,但对于那些需要确定当前的UIWebView是否包含HTML的人来说。 我写的一个方法是在下面。 我在webView加载后立即调用它

 - (void)webViewDidFinishLoad:(UIWebView *)webView { if (!webViewIsHTMLHasBeenSet) { webViewIsHTML = [self containsWebBrowserView]; NSLog(@"webViewIsHTML = %@",webViewIsHTML ? @"YES": @"NO"); } } - (BOOL)containsWebBrowserView { BOOL result = NO; for (UIView * WVSubview in [webView.scrollView subviews]) { if ([NSStringFromClass([WVSubview class]) isEqualToString:@"UIWebBrowserView"]) { result = YES; webViewIsHTMLHasBeenSet = YES; return result; } } webViewIsHTMLHasBeenSet = YES; return result; } 

只是简单地设置,

scalesPageToFit=YES用于在UIWebView上进行缩放