缩放UIWebView

9
我有一个UIWebView,用于显示各种内容,有时是HTML,有时是PDF / Powerpoint等(这些似乎由相同的基础控件处理)。
我想要做的是利用底层的UIScrollView(UIWebView的子视图)来捕获滚动视图的确切透视图,并在另一个UIWebView中重新创建滚动位置,从而使它们保持同步。
我遇到的问题是,在显示HTML内容时,UIScrollView的zoomScale属性始终为1.0(尽管在显示PDF内容时,zoomScale是正确的)。
我设法找到可以获取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,但在接收委托回调时,会接收到一个相对值的比例。
因此,我的问题是:
1.这是一个错误吗?(从我所看到的情况来看,这种行为在iOS 4和5上都可见)。
2.如何获取HTML和PDF内容的缩放比例(或其他属性),并以使状态可以被复制并与另一个UIWebView保持同步的方式获得它。
我不必使用zoomScale,因此我可以接受关于如何捕获UIWebView的滚动状态并在另一个UIWebView上重现的其他建议。

请注意,我会回答 - Vineesh TP
我已经注意到了你的回答,但它与这个问题没有任何关联。 - Jonathan Ellis
6个回答

6

加载HTML时,如果使用UIWebBrowserView,您可以使用以下代码:

zoomScale = 1.0 / webView.scrollView.minimumZoomScale

当然,前提是您可以可靠地确保HTML页面的最小缩放比例为1.0,因为某些页面可能会使用“viewport”元标记更改最小缩放比例。


这在获取可靠的、绝对的缩放比例方面实际上效果很好。唯一的问题是要传输什么到另一个UIScrollView以保持它们同步。我尝试将zoomScale和minimumZoomScale属性复制到另一个滚动视图中,但似乎不起作用... - Jonathan Ellis
很不幸,我所知道的唯一方法是在HTML的"viewport"元标签中设置缩放值。这也可以通过Javascript来实现,但需要重新加载页面才能生效。我猜你想要实时进行操作,所以这可能帮助不大。 - James Hu
谢谢你的建议,不过正如你所说,我需要实时的数据。尽管如此,我会试一试并在这里发布任何更新。 - Jonathan Ellis

6

你试过这个吗?

set scalesPageToFit=YES;

我认为这是处理问题最常见的方法。启用此设置可以使您捏合并缩放UIWebView。如果没有启用此设置,我认为您实际上无法缩放UIWebView。

现在,缩放将相对于您在UIWebView上显示的任何内容。如果它是一个大表格,则不会很接近,但如果您要缩放,则是一个良好的起点。


4

这是一个UIWebView缩放的逻辑,不需要将UIWebView添加到UIScrollView上

使用webView.scalesPageToFit=YES;的唯一问题是它会改变初始内容的字体大小,但我自己找到了另一个选项,它对我非常有效。

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

创建您的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及更高版本。

希望这对您有所帮助。:)


我知道这已经很老了,但是你的答案为我解决了一些问题。然而,scrollViewDidEndZooming:withView:atScale:似乎允许用户无限制地以20为单位继续缩放。我如何让缩放在20处绝对停止?我在http://stackoverflow.com/questions/37977020/ios-uiwebview-does-not-zoom-enough上有一个相关问题。 - RoLYroLLs

2

很遗憾,我发现获取UIWebView中网页内容的实际比例的唯一方法是访问UIWebBrowserView的私有成员:initialScale。

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

我想知道是否可以在不访问私有成员的情况下完成这个操作。

1

只需简单设置,

scalesPageToFit=YES 可以在 UIWebView 上进行缩放


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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接