Ios iPhone应用程序:避免启动屏幕后出现白色屏幕。让启动画面停留,在UIWebview加载后隐藏它?启动屏幕未正确隐藏
对于iPhone应用程序,我们的目标很简单:当UIWebview准备好显示其页面时,显示启动页面,然后隐藏它 我们需要在UIWebview准备好显示之前保留默认启动屏幕。否则,将短暂显示一个白色屏幕 不幸的是,闪屏在我们让它停留后无法隐藏。默认启动屏幕保持可见,将UIWebview隐藏在下面 我们理解这可能违反苹果的指导方针 这更像是一个原型,我们想知道我们做错了什么。有什么线索吗 我们使用的是Xcode 4.2 AppDelegate.m: ViewController.m: Curret ViewController.m生成错误:Ios iPhone应用程序:避免启动屏幕后出现白色屏幕。让启动画面停留,在UIWebview加载后隐藏它?启动屏幕未正确隐藏,ios,objective-c,iphone,uiwebview,Ios,Objective C,Iphone,Uiwebview,对于iPhone应用程序,我们的目标很简单:当UIWebview准备好显示其页面时,显示启动页面,然后隐藏它 我们需要在UIWebview准备好显示之前保留默认启动屏幕。否则,将短暂显示一个白色屏幕 不幸的是,闪屏在我们让它停留后无法隐藏。默认启动屏幕保持可见,将UIWebview隐藏在下面 我们理解这可能违反苹果的指导方针 这更像是一个原型,我们想知道我们做错了什么。有什么线索吗 我们使用的是Xcode 4.2 AppDelegate.m: ViewController.m: Curret V
//
// ViewController.m
// Stroll
//
// Created by Macintosh User on 6/4/12.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import "AppDelegate.h"
#import "ViewController.h"
@implementation ViewController
@synthesize splash;
#pragma mark - View lifecycle
- (void)viewDidLoad
{
CGRect webFrame = CGRectMake(0.0, 0.0, 320.0, 460.0);
UIWebView *webView = [[UIWebView alloc] initWithFrame:webFrame];
webView.delegate = self;
[webView setBackgroundColor:[UIColor clearColor]];
NSString *urlAddress = @"http://www.cnn.com";
NSURL *url = [NSURL URLWithString:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];
for (id subview in webView.subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).bounces = NO;
/*
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
UIImageView *imageView = appDelegate.imgv;
[imageView removeFromSuperview];
[imageView setHidden:YES];
imageView = nil; */
[self.view addSubview:webView];
[self.view bringSubviewToFront:webView];
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"Done loading UIWebView");
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
self.view.userInteractionEnabled = NO;
splash = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
splash.image = [UIImage imageNamed:@"Default.png"];
[self.view addSubview:splash];
});
}
-(void) webViewDidFinishLoad:(UIWebView *)webView {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[splash removeFromSuperView];
});
}
@end
默认情况下,Default.png用作splashscreen,然后自动删除。但是,您可以创建另一个实例,并自己将其放置到视图中。删除这部分代码
imgv = [[UIImageView alloc] init];
[imgv setImage:[UIImage imageNamed:@"Default.png"]];
[imgv setFrame:CGRectMake(0, 0, 320, 480)];
[self.window addSubview:imgv];
从您的
应用程序:didFinishLaunchingWithOptions:
方法这里有一种实现方法,首先去掉AppDelegate中的所有代码。在根视图控制器中添加一个名为“splash”的UIImageView类实例变量
现在在rootViewController.m中:
-(void) viewWillAppear:(BOOL) animated {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
self.view.userInteractionEnabled = NO;
splash = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
splash.image = [UIImage imageNamed:@"Default.png"];
[self.view addSubview:splash];
});
}
现在在webView中加载完成回调方法/块
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[splash removeFromSuperView];
});
因此,dispatch_once确保该方法在应用程序的生命周期内运行一次,并且只运行一次
编辑:
要获取您的回拨:
在viewController.h->viewC:UIViewController-(void) viewDidLoad{
CGRect webFrame = CGRectMake(0.0, 0.0, 320.0, 460.0);
UIWebView *webView = [[UIWebView alloc] initWithFrame:webFrame];
webView.delegate = self;
[webView setBackgroundColor:[UIColor clearColor]];
NSString *urlAddress = @"http://www.cnn.com";
NSURL *url = [NSURL URLWithString:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];
}
然后
[第一视图控制器.m] 启动屏幕没有消失的原因是,在将启动屏幕添加到屏幕窗口之前,调用了ViewController中的ViewDidLoad 具体来说,ViewDidLoad方法是在[self.window makeKeyAndVisible]附近调用的,就在调用splash之前 [第二视图控制器.m] 您可能不想在此处添加闪屏,因为有两个原因:1)在ViewWillDisplay中,可能尚未创建视图;2)视图将出现:可以多次调用您可能并不真正想要的视图 [可行的方法] 一个可行的方法(我正在使用的)是你的第一次和第二次试验的结合。我是说
完成对不起,我们需要澄清。我们希望启动屏幕保持不变,以避免出现在启动屏幕消失(默认情况下)和UIWebview渲染之间的白色屏幕。所以我们需要这个代码保持不变。我们对Objective-C是新手:我们没有rootViewController。m。。。你是说ViewController.m吗?谢谢另外,UIWebview的加载完成回调方法是什么?根视图控制器指的是应用程序启动时加载的第一个视图,请查看UIWebViewDelegate-(它有一个名为webViewDidFinishLoad:)的方法。因此,如果我们只有一个ViewController.m,那么您的第一个代码块就会出现在那里?请参阅编辑,在尝试创建初始屏幕之前,您应该阅读并了解有关视图控制器、委托和回调的更多信息,以供将来参考。闪屏应该是你最不应该担心的:)哇,这是因为removeFromSuperView应该是removeFromSuperView.:)谢谢您的回答,但是您如何注册和捕获通知?我们的应用程序主要是作为一个web应用程序,因此对Objective-C的接触有限(并避免PhoneGap,因为我们只需要在应用程序中显示一个网页)。@Crashalot,您可以参考NSNotificationCenter类参考,这只是一个提醒,当您处理启动视图时,请记住作为观察者删除它
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[splash removeFromSuperView];
});
-(void) viewDidLoad{
CGRect webFrame = CGRectMake(0.0, 0.0, 320.0, 460.0);
UIWebView *webView = [[UIWebView alloc] initWithFrame:webFrame];
webView.delegate = self;
[webView setBackgroundColor:[UIColor clearColor]];
NSString *urlAddress = @"http://www.cnn.com";
NSURL *url = [NSURL URLWithString:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];
}
-(void) webViewDidFinishLoad:(UIWebView *)webView {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[splash removeFromSuperView];
});
}