我有UIWebView
我用它来显示各种内容,有时是HTML,有时是PDF / Powerpoint /等(这些似乎都是由相同的底层控件处理的。)
我想要做的是利用基础UIScrollView
(UIWebView
的子视图)来捕捉滚动视图的确切视角,并在另一个UIWebView
中重新创建滚动位置,从而使它们保持同步。
我遇到的问题是显示HTML内容时zoomScale
的{{1}}属性始终为UIScrollView
(但在显示PDF内容时,1.0
是正确的)。
我设法找到了唯一可以获得HTML页面缩放比例的地方是zoomScale
委托方法。我发现scrollViewDidEndZooming:withView:atScale:
参数似乎提供了一个相对缩放比例,以及缩放比例在缩放操作开始之前的比例。因此,例如当放大时,该参数为> 1,当缩小时它是< 1,并且它似乎是两个缩放比例之间的相对值而不是绝对缩放比例。)
我进一步发现,从根本上说,HTML和PDF内容由两个不同的底层视图处理:atScale:
处理HTML内容,UIWebBrowserView
处理PDF的显示。
换句话说,当使用UIWebPDFView
时,UIWebPDFView
的{{1}}属性完全可靠(例如zoomScale
缩小,UIScrollView
例如,用于放大)。另一方面,1.0
更加繁琐,在向2.4
询问其UIWebBrowserView
时,始终返回UIScrollView
,但在收到委托回调时,会收到一个比例值是一个相对值。
所以我的问题是: -
这是一个错误吗? (从我所见过的iOS 4和5上都可以看到这种行为。)
如何同时获取HTML和PDF内容的zoomScale
(或其他一些属性/属性),并以这样的方式获取状态:状态可以复制并保持同步另一个1.0
。
我不愿意使用zoomScale
,所以我愿意接受有关如何在另一个UIWebView
上捕获并复制zoomScale
的滚动状态的其他建议。< / p>
答案 0 :(得分:6)
你试过这个吗?
set scalesPageToFit=YES;
这是我认为最常见的解决问题的方法。设置使您可以捏合和缩放UIWebView。我不认为你可以实际放大/缩小UIWebView。
现在缩放将与您在UIWebView上显示的内容相关。如果它是一个大桌子,它不是那么接近,但如果你要捏缩放它是一个很好的起点。
答案 1 :(得分:6)
加载HTML时,正在使用UIWebBrowserView
,您可以使用
zoomScale = 1.0 / webView.scrollView.minimumZoomScale
当然,假设您可以可靠地确保HTML页面的最小缩放为1.0,因为某些页面可以使用“viewport”元标记更改最小缩放。
答案 2 :(得分:4)
此逻辑用于缩放UIWebView,无需在UIScrollView上添加UIWebView
webView.scalesPageToFit=YES;
唯一的问题是,它改变了初始内容字体大小,但我自己有其他选择,它对我来说非常好。
将<UIWebViewDelegate, UIScrollViewDelegate>
添加到 .h文件
创建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上测试 - 使用Xcode 5.1.1和iOS 6.1及更高版本的10.9.3。
我希望这会对你有所帮助。 :)
答案 3 :(得分:2)
不幸的是,我发现在UIWebView中获取Web内容的实际比例的唯一方法是访问UIWebBrowserView的私有成员:initialScale。
float initialScale = (access to [UIWebBrowserView initialScale])
float zoomScale = 1.0 / webView.scrollView.minimumZoomScale;
float actualScale = zoomScale * initialScale;
我想知道这是否可以在不访问私人会员的情况下完成。
答案 4 :(得分:1)
这可能有点晚,但对于那些需要确定当前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;
}
答案 5 :(得分:1)
只需设置,
scalesPageToFit=YES
用于UIWebView上的缩放缩放