我是一名创建 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 启动之前,如何将该视频放置在启动内容的顶部?
提前致谢, //彼得
最佳答案
So what I'm wondering is, how would I place this video on top of the splash's content, before didFinishLaunchingWithOptions kicks in?
实际上,您可以在 didFinishLaunchingWithOptions
中执行此操作。将此语句放入其中(在 Xcode 为您生成的 bolierplate 代码中,您应该已经调用了 makeKeyAndVisible
,因此只需补充它即可):
[self.window addSubview:moviePlayer.view];
[self.window makeKeyAndVisible];
之前已实例化您的 moviePlayer。
避免黑屏的一种方法可能是这样的:
创建一个包含 Default.png 图像的 UIImageView;
通过将此类 UIImageView 作为 subview 添加到 self.window 来显示它(这不会产生黑屏效果);
初始化您的播放器(我认为这需要一些时间,因此会出现黑屏)并将其添加到 UIImageView 下方;
当播放器准备好(
viewDidLoad
)时,将其推到 UIImageView 顶部。
最后,我不知道你的播放器将如何发出视频播放结束的信号,但我假设你有一些委托(delegate)方法;让你的 appDelegate 也成为你的播放器委托(delegate),然后从 self.window 中删除 UIImageView 和播放器,并将其他 View 添加到 self.window 中。
希望这有帮助。
编辑:
这是我在应用程序委托(delegate) 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
...
}
关于objective-c - 在appDelegate init方法中启动self.window,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11922722/