1

我希望允许用户将缩放因子与文档相关联,并在 UIWebView 中显示该文档时将其用作起点。然而,这似乎webViewDidFinishLoad:只表示内存加载的结束,不包括渲染或布局。这是演示该问题的示例代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIWebView *webView = (UIWebView *)self.view;
    webView.delegate = self;
    webView.scalesPageToFit = YES;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSString *urlString = [[NSBundle mainBundle] pathForResource:@"Doc" ofType:@"pdf"];
    NSURL *file = [NSURL fileURLWithPath:urlString];
    [(UIWebView *)self.view loadRequest:[NSURLRequest requestWithURL:file]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (!webView.isLoading) {
        [webView.scrollView setZoomScale:1.5 animated:YES];
    }
}

对 setZoomScale: 的调用没有任何效果(即文件以 1.0 的缩放系数显示),显然是因为它发生在滚动视图处于可以处理它的某种状态之前。如果我将上面的最终方法更改为下面的方法,一切都会如我所愿。

- (void)delayedZoomMethod {
    [((UIWebView *)self.view).scrollView setZoomScale:1.5 animated:YES];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self performSelector:@selector(delayedZoomMethod) withObject:nil afterDelay:1.0];
}

当然,这是一个坏主意,因为 1.0 延迟是任意的,对于绝大多数情况来说可能太长,并且在某些未知的条件下可能太短。

文档说:“如果您的应用程序想要自定义 Web 视图的滚动行为,它可以访问滚动视图。 ”有谁知道我可以观察到的通知或 Web 视图或其滚动视图中的属性那个陈述成为真的时被告知?

4

3 回答 3

2

如果您可以控制 html 代码,这可能会有所帮助。我已经能够通过以下方式让 html 事件触发 objC 方法。

html 事件触发 javascript 将字符串写入 window.location uiwebview 然后使用 uiwebviewdelegate 通过此函数 webView:shouldStartLoadWithRequest:navigationType 接收字符串:

这有点骇人听闻。

但是我认为没有办法知道web视图已经完成渲染,除非你写了html页面并且可以在页面末尾放入一个js函数来执行。

于 2012-08-20T19:03:52.377 回答
0

如果您使用 UIWebView 预览 PDF 文件,那么它可能不是最好的方法。有一个用于此目的的 QLPreViewController(来自 iOS 4.0)。Quick Look 预览控制器可以显示以下项目的预览:

  • iWork 文档
  • Microsoft Office 文档(Office '97 和更高版本)
  • 富文本格式 (RTF) 文档
  • PDF 文件
  • 图片
  • 统一类型标识符 (UTI) 符合 public.text 类型的文本文件(请参阅统一类型标识符参考)
  • 逗号分隔值 (csv) 文件
于 2012-08-25T20:11:51.500 回答
-1

如果我将上面的最终方法更改为下面的方法,一切都会如我所愿。

当然,这是一个坏主意,因为 1.0 延迟是任意的,对于绝大多数情况来说可能太长,并且在某些未知的条件下可能太短。

文档说:“如果您的应用程序想要自定义 Web 视图的滚动行为,它可以访问滚动视图。”

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (!webView.isLoading) //WEBDIDFINISHLOAD? {
        [webView.scrollView setZoomScale:1.5 animated:YES];
    }
}

看,didFinishLoadMethod 是由来自 NSURLConnection 的异步通知调用的,它不一定在主线程中(因为您的 UI 更新不起作用)

performSelector..after 延迟方法很好。延迟甚至没有任何意义,您只是跳到主线程进行 UI 更新并允许 NSURLConnection 通知完成。

如果你说 afterDelay:0.0 可能没关系

这是 iOS 和 OSX 中的常见情况,您必须弄清楚哪些线程能够更新 UI、GCD、NSOperationQueues 和创建线程上的后台 runLoops 都使这变得复杂。

您找到了解决方案,但您需要知道它的含义。在 mainThread 上调用 performSelector,设置一个短暂的延迟并对其进行修复。

于 2012-08-28T10:06:18.080 回答