放大UIWebView
我有一个UIWebView
,我正在使用它来显示各种各样的内容,有时HTML和有时PDF / Powerpoint /等(这似乎是由相同的底层控制处理)。
我想要做的就是利用底层的UIScrollView
( UIWebView
的子视图)捕获滚动视图的确切透视图,并在另一个UIWebView
重新创build滚动位置,从而保持它们同步。
我遇到的问题是显示HTML内容时(尽pipe显示PDF内容时, zoomScale
是正确的), UIScrollView
的zoomScale
属性始终为1.0
。
我设法发现,我可以得到一个HTML页面的缩放比例的唯一的地方是在scrollViewDidEndZooming:withView:atScale:
委托方法。 我发现atScale:
参数似乎提供了一个相对的缩放比例,缩放比例是在缩放操作开始之前的。 因此,例如,当放大时,该参数> 1,当缩小时<1,它似乎是两个缩放比例之间的相对值,而不是绝对缩放比例)。
我进一步发现的是,从根本上讲,HTML和PDF内容由两个不同的底层视图处理: UIWebBrowserView
处理HTML内容, UIWebPDFView
处理PDF的显示。
换句话说,当使用UIWebPDFView
, UIScrollView
的zoomScale
属性是完全可靠的(例如, 1.0
缩小, 2.4
放大)。 另一方面, UIWebBrowserView
更加繁琐,当询问UIScrollView
的zoomScale
,总是返回1.0
,但是当接收到委托callback时,会收到一个相对值的比例值。
所以我的问题是:
-
这是一个错误? (从我所见过的iOS 4和5上都可以看到这种行为)。
-
我怎样才能同时获得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上进行缩放