objective-c - 在appDelegate init方法中启动self.window

标签 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 为空,我也尝试使用以下代码设置 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。

避免黑屏的一种方法可能是这样的:

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

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

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

  4. 当播放器准备好(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/

相关文章:

ios - _UItextContaineView 内存未释放

objective-c - 多次用新数据刷新 NSTableView

xcode - 使用 api key 时的 Apple Application Loader altool 问题

objective-c - Obj-C... "Incompatible types in initialization"错误

objective-c - iOS 中 UITextField 中的密码验证

iOS:如何设置 SKSpriteNode 的程序化 alpha 掩码

xcode - 在目标 'Unity-iPhone' 和 'UnityFramework' 之间循环依赖;构建可能会产生不可靠的结果

android - 点击屏幕任意位置拍照的代码

cordova - 使用 azure-mobile-apps 和 Cordova 刷新 Google token

javascript - WebSQL 事务不会在 JS 回调函数中运行