加载UIWebView块滚动视图动画
问题描述:
我想在滚动动画发生期间加载带有数据的网页视图。动画呼叫就是这样:加载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秒。
还能做什么?
答
尝试在单独的线程上启动加载请求。 最简单的方法就是使用GCD。
如果这是你的要求:
NSURLRequest *request = [NSURLRequest requestWithURL:someURL];
一个单独的线程调用将是这样的:
dispatch_queue_t workerQueue = dispatch_queue_create("QueueIdentifier", NULL);
dispatch_async(workerQueue,^{
[yourWebView loadRequest:request];
});
dispatchRelease(workerQueue);
使用这个应该不会再阻止你的UI线程,因为所有的负载应该做的事在背景中。
remmeber为您的ivar使用__block – 2012-04-10 13:44:29
嗯,明天我会试试。我认为应该在主线程中调用UI组件的任何方法。 – manuyavuz 2012-04-10 18:50:32
@Vlad,我试过你的解决方案,但它不工作。详情在我的编辑。 – manuyavuz 2012-04-11 07:34:37