在介绍问题之前,我想提及一下,我曾尝试寻找解决方案here和here。
我正在创建一个混合应用程序,该应用程序使用本机UIWebView
呈现响应式设计的Web应用程序。以下是问题描述:
1.我有一个UITabBarController
。
2.每个选项卡都有一个UIWebView
。
3.我必须预加载所有选项卡。
4.在内容加载到第一个选项卡上之前,我正在显示UIActivityIndicator
。
5.出现白色屏幕约 8-10秒,然后开始显示内容。
我很高兴看到这次变成 2-4秒。
以下是我的实现:
[self performSelectorOnMainThread:@selector(loadAllTabs) withObject:nil waitUntilDone:YES];
-(void) loadAllTabs
{
for(UIViewController * viewController in self.viewControllers){
if(![[NSUserDefaults standardUserDefaults]boolForKey:@"isSessionExpired"])
{
if((int)[self.viewControllers indexOfObject:viewController] != 4)
{
viewController.tabBarItem.tag = (int)[[self viewControllers] indexOfObject:viewController];
[viewController view];
}
}
}
}
在WebView控制器的
viewDidLoad
中,我有:[_tgWebView loadRequest:[NSURLRequest requestWithURL:homeURL]];
我期待suppressesIncrementalRendering,但是由于我正在预加载所有选项卡,因此无法正常工作。
由于我的应用支持 iOS 7+ ,因此WKWebView不能在此处应用。
我还想到了increasing发射映像的持续时间,但了解到这不是一个好习惯。
可以使用 GCD 来实现吗?
请指出我的实现中的陷阱,以便我的应用程序获得更好的性能。
最佳答案
首先,在每个选项卡上隐藏UIWebView直到完成加载,然后再显示它。在UIWebView下面,您可以使用一些占位符图像来描述其加载。然后,使用webViewDidFinishLoad委托方法在完成加载后显示Web视图。这种方法将是非阻塞的。
- (void)webViewDidFinishLoad:(UIWebView *)webview
{
if (webview.isLoading)
return;
else
webView.hidden = false;
}
其次,预加载第一个选项卡,然后在显示第一个选项卡的同时加载后续选项卡。您可以通过将以下代码放在第一个选项卡的viewDidLoad方法中来做到这一点:
// Preload the subsquent tabs
for (UIViewController *aVC in self.tabBarController.viewControllers)
if ([aVC respondsToSelector:@selector(view)] && aVC != self)
aVC.view;
这样,其他选项卡Web视图将以非阻塞方式在后台加载。您可以将其与在加载时隐藏Web视图结合起来,以防用户在页面加载前导航到其他选项卡。
我用三个选项卡对此进行了测试,效果很好。
因此,第一个视图控制器可能看起来像这样:
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Load the website
[self loadWebView];
// Preload the subsquent tabs
for (UIViewController *aVC in self.tabBarController.viewControllers)
if ([aVC respondsToSelector:@selector(view)] && aVC != self)
aVC.view;
}
-(void)loadWebView
{
// Create Request
NSURL *url = [NSURL URLWithString:@"http://anandTech.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// Load the page
[webView loadRequest:request];
}
- (void)webViewDidFinishLoad:(UIWebView *)webview
{
if (webview.isLoading)
return;
else
webView.hidden = false;
}
编辑:
删除GDC,因为它在视图具有WebView时崩溃
关于ios - 每次启动时均会出现UIWebView白屏,同时预加载所有选项卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28272576/