2012-04-10 95 views
0

我想在滾動動畫發生期間加載帶有數據的網頁視圖。動畫呼叫就是這樣:加載UIWebView塊滾動視圖動畫

[scrollView scrollRectToVisible:aFrame animated:YES]; 

問題是,如果一個web視圖負載過程中與滾動視圖的動畫重疊,動畫口吃,而不是平滑的動畫發生。看起來加載進程阻止主線程,所以動畫不能按預期工作。

我能做些什麼來解決這個問題?在一些帖子中,人們建議將webview作爲子視圖的最後部分

- (void)webViewDidFinishLoad:(UIWebView *)theWebView 

方法。但是如果我這樣做,加載的數據是不可見的。

感謝您的幫助。

編輯1:

@Vlad

該解決方案是不工作我猜。我打電話的WebView負載是這樣的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) { 
    [_webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:path]]; 
}); 

但我看到的是,雖然loadHTMLString:基本URL:方法被調用在非主線程,

- (void)webViewDidStartLoad:(UIWebView *)theWebView 

- (void)webViewDidStartLoad:(UIWebView *)theWebView 

方法在主線程中調用。所以這個方法沒有提供我一個改進。

同樣作爲一個細節,webViewDidStartLoad和webViewDidFinishLoad方法之間的時間差不多0.3秒。

還能做什麼?

回答

0

嘗試在單獨的線程上啓動加載請求。 最簡單的方法就是使用GCD。

如果這是你的要求:

NSURLRequest *request = [NSURLRequest requestWithURL:someURL]; 

一個單獨的線程調用將是這樣的:

dispatch_queue_t workerQueue = dispatch_queue_create("QueueIdentifier", NULL); 
dispatch_async(workerQueue,^{ 
    [yourWebView loadRequest:request]; 
}); 
dispatchRelease(workerQueue); 

使用這個應該不會再阻止你的UI線程,因爲所有的負載應該做的事在背景中。

+1

remmeber爲您的ivar使用__block – 2012-04-10 13:44:29

+0

嗯,明天我會試試。我認爲應該在主線程中調用UI組件的任何方法。 – manuyavuz 2012-04-10 18:50:32

+0

@Vlad,我試過你的解決方案,但它不工作。詳情在我的編輯。 – manuyavuz 2012-04-11 07:34:37