簡體   English   中英

如何檢測UIWebView的視圖布局完成

[英]How can I detect the completion of view layout for a UIWebView

我想允許用戶將縮放系數與文檔相關聯,並在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視圖或其滾動視圖中的通知或屬性?被告知何時該陳述成真?

如果您可以控制html代碼,則可能會有所幫助。 我已經能夠以以下方式讓html事件觸發objC方法。

html事件觸發將javascript寫入window.location的javascript的uiwebview,然后使用uiwebviewdelegate通過此函數webView:shouldStartLoadWithRequest:navigationType來接收字符串:

這有點hacky。

但是我不認為有一種方法可以知道Web視圖是否已完成渲染,除非您編寫了html頁面並且可以在頁面的末尾放置一個js函數來執行。

如果使用UIWebView預覽PDF文件,則可能不是最佳方法。 有一個QLPreViewController(來自iOS 4.0)專門用於此目的。 快速查看預覽控制器可以顯示以下項目的預覽:

  • iWork文件
  • Microsoft Office文檔(Office '97和更高版本)
  • 富文本格式(RTF)文檔
  • PDF文件
  • 圖片
  • 統一類型標識符(UTI)符合public.text類型的文本文件(請參閱《統一類型標識符參考》)
  • 逗號分隔值(csv)文件

如果我將上面的最終方法更改為以下方法,一切都會按我希望的那樣工作。

當然,這是個壞主意,因為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和創建的線程上的后台runLoop,這會使這一切變得復雜。

您找到了解決方案,但是您需要知道它的含義。 在mainThread上執行對performSelector的調用,設置一個短延遲及其固定時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM