【问题标题】:How to reset UIWebView's zoom? I'm already using scalesPagesToFit = YES;如何重置 UIWebView 的缩放?我已经在使用 scalesPagesToFit = YES;
【发布时间】:2011-03-20 04:55:23
【问题描述】:

过去一周我一直在寻找这个问题的答案。

我在 UIScrollView 中有一个 UIWebView。一切正常,但我希望 UIWebView 的内容在方向改变时重置其缩放。

在 UIWebView 内的 HTML 中,我将视口的宽度(带有元标记)设置为“设备宽度”,然后在 Obj-C 端,我设置 scalesPagesToFit = YES;

我尝试使用 javascript 重置缩放;通过在运行时替换元标记;重新加载;访问 UIWebView 内部的 UIScrollView;等等……

但没有成功。

各位大神知道解决方法吗?

我唯一能想到的就是每次我们改变方向时重新创建 UIWebViews,但这会使它们在渲染内容时闪烁为白色,这看起来很糟糕:(

有什么想法吗?

非常感谢, 安德烈

【问题讨论】:

  • 也许诀窍在于重建网络视图?我试过了,但是它们会闪烁白色,因为那一刻它们会丢失内容,所以看起来不太好。还有其他解决方法吗?
  • 在黑暗中拍摄,但我认为维基百科网站的移动版本可以做到这一点。您可以在它的 html / javascript 上达到顶峰。

标签: iphone uiwebview uiscrollview zooming reset


【解决方案1】:

根据 Captnwalker1 的回答,我想出了这个:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    if(toInterfaceOrientation ==UIInterfaceOrientationPortrait||toInterfaceOrientation==UIInterfaceOrientationMaskPortraitUpsideDown)
    {
        currentScrollView = [[webView subviews] objectAtIndex:0];
        [currentScrollView zoomToRect:CGRectMake(0, 0, currentScrollView.contentSize.width, currentScrollView.contentSize.height) animated:NO];
    }
    else
    {
        currentScrollView = [[webView subviews] objectAtIndex:0];
        [currentScrollView zoomToRect:CGRectMake(0, 0, currentScrollView.contentSize.width, currentScrollView.contentSize.height) animated:NO];
    }
}

所以加载你的 webview 图片,图片会在旋转时重置它的大小。

【讨论】:

    【解决方案2】:

    在 iOS 5+ 上,您可以访问 scrollView。 做吧:

    [webView.scrollView setZoomScale:1.0];

    【讨论】:

    • 效果很好,谢谢。这比 for 循环简单得多。但正如@Andre 在对已接受答案的评论中所说,您需要首先替换 HTML 中的元标记以将视口的最大比例更改回 1.0
    【解决方案3】:

    更新: 使用时缩小无法正常工作

    [[[webView subviews] lastObject] setZoomScale:0.25];
    

    页面上缩小的图像质量非常糟糕。正在做:

    [[[webView subviews] lastObject] setZoomScale:0.25 animated:YES];
    

    修复它。所以最后一行是你可以使用的。

    webView 是位于某个 IB 文件上的 UIWebView 的子类。我根本没有使用视口。我发现应该选择从 Cocoa Touch 端执行此操作或使用 JS。

    我用过:

    webView.scalesPageToFit = YES;
    

    不知道有没有办法重置 scalesPageToFit。

    【讨论】:

      【解决方案4】:

      如果您想以编程方式执行此操作,这是我能找到的唯一方法:(如果您愿意,请指定您自己的尺寸,我在输入表单字段后尝试缩小)

      UIScrollView *sv = [[webViewView subviews] objectAtIndex:0];
      [sv zoomToRect:CGRectMake(0, 0, sv.contentSize.width, sv.contentSize.height) animated:YES];
      

      【讨论】:

        【解决方案5】:

        我只是在这里猜测并没有尝试过,但是 AFAIK 一个 UIWebView 有一个 UIScrollView 孩子。所以应该可以做到:

        for (UIScrollView *scroll in [myWebView subviews]) {
            // Make sure it really is a scroll view and reset the zoom scale.
            if ([scroll respondsToSelector:@selector(setZoomScale:)])
                [scroll setZoomScale:1.0];
        }
        

        【讨论】:

        • 您知道这是否会通过 App Store 的批准,还是私有 API?干杯,安德烈
        • 这应该没问题。我看过一篇文章,它使用相同的技术在视图到达末尾时关闭视图的弹跳。这里只使用公共 API,因此 Apple 没有什么可抱怨的。如果 Apple 决定将 UIWebView 更改为不再使用 UIScrollView 子级,则此代码不会崩溃,只是不会再重置缩放。
        • 酷。只是让你知道,我之前尝试过这段代码,但它没有用。我发现要使其工作(在我的情况下),您需要首先替换 HTML 中的元标记,将视口的最大比例更改回 1.0,然后调用 setZoomScale。
        • 我注意到,只有在用户没有通过捏住屏幕来更改缩放时,更改元视口才有效。一旦他手动更改它,在重置视口之后,本机端就需要此代码。正如@thieryb 在另一个答案中所说,现在有一种更短的方法:[webView.scrollView setZoomScale:1.0];
        猜你喜欢
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多