在appDelegate init方法中启动self.window

时间:2012-08-12 13:58:31

标签: objective-c xcode cordova

我是一名创建Apache Cordova应用程序的Web开发人员,因此我对Objective-C的了解非常少。一切都很顺利,直到我尝试用视频补充启动画面。它有点做,但不完全..它首先显示Default.png,然后是SplashScreenLoader。它然后实际播放视频,我知道这是因为音频被发射,但视频层没有显示。

我发现self.window或self.viewController都是在didFinishLaunchingWithOptions中定义的,因此它们不存在于 - (id)init方法中。因此,我无法找到一种方法将它置于加载飞溅之上。

我的init方法目前在AppDelegate.m中看起来像这样:

- (id) init {   

NSString *moviePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Splash_v1.mp4"];
 NSURL *movieURL = [NSURL fileURLWithPath:moviePath];

 MPMoviePlayerController* moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
 moviePlayer.controlStyle = MPMovieControlStyleNone;
 [moviePlayer.view setFrame: self.window.bounds];
 [self.window addSubview:moviePlayer.view];
 [self.window makeKeyAndVisible];
 [moviePlayer play];


NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

[CDVURLProtocol registerURLProtocol];

return [super init];

}

这里self.window为null,我也试图用这段代码设置self.window:

CGRect screenBounds = [[UIScreen mainScreen] bounds];
self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease];

......没有优先权。它实际设置它,但对于后续代码,它不想这样做。

所以我想知道的是,在didFinishLaunchingWithOptions开始之前,我如何将这个视频置于启动内容之上?

提前致谢, //彼得

2 个答案:

答案 0 :(得分:2)

  

所以我想知道的是,在didFinishLaunchingWithOptions开始之前,我如何将这个视频置于启动内容之上?

实际上,你是在didFinishLaunchingWithOptions中做到的。把这些语句放在那里(在Xcode为你生成的bolierplate代码中,你应该已经调用了makeKeyAndVisible,所以只需补充它):

[self.window addSubview:moviePlayer.view];
[self.window makeKeyAndVisible];

之前已实例化过moviePlayer。

避免空白屏幕的一种方法是:

  1. 创建一个包含Default.png图像的UIImageView;

  2. 通过将它作为子视图添加到你的self.window来显示这样的UIImageView(这不会产生黑屏效果);

  3. 初始化你的播放器(我认为它需要一些时间,因此黑屏)并将其添加到UIImageView下面;

  4. 当玩家准备就绪(viewDidLoad)时,将其推到UIImageView的顶部。

  5. 最后,我不知道你的播放器将如何表示视频播放的结束,但我认为你有一些委托方法;让你appDelegate也是你的玩家代表,从那里,从self.window中删除UIImageView和播放器,并将你的其他视图添加到self.window。

    希望这有帮助。

    编辑:

    这是我在你的app appid appDidFinishLaunching中尝试做的粗略草图:

    self.moviePlayer = <INIT MOVIEW PLAYER CONTROLLER>
    self.backgroundImage = <INIT UIImageView with Default.png>
    
    [self.window addSubview:self.moviePlayer.view];
    [self.window addSubview:self.backgroundImage];
    [self.window makeKeyAndVisible];
    

    在你的电影播放器​​viewDidLoad中:

    - (void)viewDidLoad {
        [super viewDidLoad];
        ...
        [self.view.superview addSubview:self.view]; //-- this will just move the player view to the top
        ...
    }
    

答案 1 :(得分:1)

如果这有助于其他任何人,我有同样的问题,通过移动'[self.window makeKeyAndVisible];像这样的子视图,所以在appdelegate.m:

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
myView.backgroundColor = [UIColor blueColor];

[self.window makeKeyAndVisible];
[self.window addSubview:myView];

这样可以正常工作,但如果我交换最后两个语句,子视图就不会显示。