![](/img/trans.png)
[英]iOS how can I add a completion block to UIWebView loadRequest:?
[英]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)專門用於此目的。 快速查看預覽控制器可以顯示以下項目的預覽:
如果我將上面的最終方法更改為以下方法,一切都會按我希望的那樣工作。
當然,這是個壞主意,因為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.