2

我是一名创建 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 为空,我还尝试使用以下代码设置 self.window:

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

...没有占上风。它实际上设置了它,但是对于后续代码它不想这样做。

所以我想知道的是,在 didFinishLaunchingWithOptions 启动之前,我如何将此视频放在启动画面的内容之上?

提前致谢,//彼得

4

2 回答 2

2

所以我想知道的是,在 didFinishLaunchingWithOptions 启动之前,我如何将此视频放在启动画面的内容之上?

实际上,您在didFinishLaunchingWithOptions. 将这些语句放在那里(在 Xcode 为您生成的样板代码中,您应该已经调用了makeKeyAndVisible,所以只需对其进行补充):

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

之前已经实例化了你的moviePlayer。

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

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

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

  3. 初始化您的播放器(我认为这需要一些时间,因此会出现黑屏)并将其添加到 UIImageView 下方;

  4. 当播放器准备好时 ( viewDidLoad) 将其推到 UIImageView 的顶部。

最后,我不知道您的播放器将如何发出视频播放结束的信号,但我假设您有一些委托方法;让您的 appDelegate 也成为您的播放器代表,然后从 self.window 中删除 UIImageView 和播放器,并将您的其他视图添加到 self.window。

希望这可以帮助。

编辑:

这是我将在您的应用程序委托 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
    ...
}
于 2012-08-12T14:06:48.760 回答
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];

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

于 2013-02-04T01:23:39.880 回答