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 は null です。また、次のコードで self.window を設定しようとしました。

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

...勝てずに。実際には設定しますが、後続のコードでは実行したくありません。

だから私が疑問に思っているのは、didFinishLaunchingWithOptions が開始される前に、このビデオをスプラッシュのコンテンツの上にどのように配置するかということです。

前もって感謝します、//ピーター

4

2 に答える 2

2

だから私が疑問に思っているのは、didFinishLaunchingWithOptions が開始される前に、このビデオをスプラッシュのコンテンツの上にどのように配置するかということです。

実際には、 でそれを行いますdidFinishLaunchingWithOptions。このステートメントをそこに入れます (Xcode が生成する bolierplate コードには、既に への呼び出しがあるはずmakeKeyAndVisibleなので、それを補完するだけです):

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

以前に moviePlayer をインスタンス化した。

空白の画面を回避する 1 つの方法は次のとおりです。

  1. Default.png 画像を含む UIImageView を作成します。

  2. サブビューとして self.window に追加して、そのような UIImageView を表示します (これにより、黒い画面効果は作成されません)。

  3. プレーヤーを初期化し(時間がかかるため、黒い画面になると思います)、UIImageViewの下に追加します。

  4. プレーヤーの準備ができたら ( viewDidLoad) UIImageView の上にプッシュします。

最後に、プレーヤーがビデオ再生の終了をどのように通知するかはわかりませんが、デリゲート メソッドがあると仮定します。appDelegate をプレーヤー デリゲートにもし、そこから UIImageView とプレーヤーを self.window から削除し、他のビューを 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];

ムービー プレーヤー ビューでDidLoad:

- (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];

これは問題なく動作しますが、最後の 2 つのステートメントを入れ替えると、サブビューが表示されません。

于 2013-02-04T01:23:39.880 に答える