缩放UIWebView

时间:2011-11-21 15:51:54

标签: iphone objective-c ios uiwebview

我有UIWebView我用它来显示各种内容,有时是HTML,有时是PDF / Powerpoint /等(这些似乎都是由相同的底层控件处理的。)

我想要做的是利用基础UIScrollViewUIWebView的子视图)来捕捉滚动视图的确切视角,并在另一个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,但在收到委托回调时,会收到一个比例值是一个相对值。

所以我的问题是: -

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

  2. 如何同时获取HTML和PDF内容的zoomScale(或其他一些属性/属性),并以这样的方式获取状态:状态可以复制并保持同步另一个1.0

  3. 我不愿意使用zoomScale,所以我愿意接受有关如何在另一个UIWebView上捕获并复制zoomScale的滚动状态的其他建议。< / p>

6 个答案:

答案 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上的缩放缩放