4

私はiOSプラットフォームとObjectiveC全般のコーディングにかなり慣れていません。UIScrollView内に埋め込まれたUIImageViewを介して表示される背の高いpngファイルと、その横にある映画を再生するボタンを備えたストーリーボードを利用したシンプルなiPhoneアプリを作成しています。

私の問題は、ムービーが終了/終了して元の画面に戻ったときに、UIScrollView内のスクロールが機能しないことです。私は「原因」を突き止めました。MPMoviePlayerViewControllerobject.viewをself.viewサブビューに追加すると発生します。しかし、この問題を修正する方法がわかりません。これが私の蒸留コードです:

.hファイル

@interface StuffViewController : UIViewController 

@property (strong,nonatomic) IBOutlet UIImageView *imageView;
@property (strong,nonatomic) IBOutlet UIScrollView *scrollView;

-(IBAction) playMovie;
-(void) moviePlayBackDidFinish:(NSNotification*)notification;

@end

.mファイル

-(void) viewDidLoad {
    self.imageView.image = [UIImage imageNamed:@"image.png"];
}

-(void) viewDidAppear:(BOOL)animated {
    self.scrollView.contentSize = self.imageView.image.size;
}

-(void) playMovie {
    NSURL *movieURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                         pathForResource:@"movieTitle" ofType:@"mp4"]];
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] 
                                                initWithContentURL:movieURL];
       [[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(moviePlayBackDidFinish:)
                                            name:MPMoviePlayerPlaybackDidFinishNotification
                                          object:moviePlayer];
    [moviePlayer setMovieSourceType:MPMovieSourceTypeFile];
    [[self view] addSubview:moviePlayer.view];   //SCROLLING BREAKS HERE
    [moviePlayer setFullscreen:YES];
    [moviePlayer play];
}

-(void)moviePlayBackDidFinish: (NSNotification*)notification {
    MPMoviePlayerController *movieDone = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [movieDone.view removeFromSuperview];
    [movieDone setFullscreen:NO];
}

セクションをコメントアウトすることで原因を特定しました。前述のように、スクロールは「[[self view] addSubview:moviePlayer.view];」で「ロック」されます。別のビューに移動してから戻るまで、行は回復しません。

これに関するありとあらゆる助けをいただければ幸いです。

編集:根本的な問題を発見するのに役立つかもしれない興味深いしわを発見しました。

私はこれをずっと使っていMPMoviePlayerControllerます。しかし、いくつかの興味深いことに切り替えるとMPMoviePlayerViewController、起こっています。

これが変更された-(void)playMovieです

-(void) playMovie {
   self.scrollView.contentOffset = CGPointZero;
   NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                    pathForResource:totalTitle ofType:@"mp4"]];
   MPMoviePlayerViewController *playerController =  [[MPMoviePlayerViewController alloc] initWithContentURL:url];
   [self presentMoviePlayerViewControllerAnimated:playerController];
   playerController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
   [playerController.moviePlayer play];
   playerController = nil;
}

興味深いのは、UIScrollViewは引き続き機能することですが、下にスクロールすると、ムービーが開始されたときの位置から上にスクロールできなくなります。self.scrollView.contentOffset = CGPointZeroの先頭に追加しplayMovieて、scrollViewに上に移動するように指示することでこれを修正しました(したがって、上にスクロールして戻る必要はありません)。ある種のifステートメントをコードに追加すると、viewDidAppearscrollView.contentSizeが再実行されなくなる可能性があると思いますが、上にスクロールできないという問題は修正される可能性がありますが、上。

最後の問題です。このようにMPMoviePlayerViewControllerを使用すると、MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];行が実行されたときにデバッガーにいくつかの興味深いエラーが表示されます。それらは次のとおりです。

Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextSaveGState: invalid context 0x0 
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextClipToRect: invalid context 0x0
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextTranslateCTM: invalid context 0x0
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextDrawShading: invalid context 0x0
Oct 25 10:25:51 Compy.local AppName[14590] <Error>: CGContextRestoreGState: invalid context 0x0

何も壊れていないようです。ただし、誤ったエラーステートメントに関しては、私は完璧主義者になる傾向があります。私はこれらのエラーについていくつかの調査を行いましたが、この状況で強力な手を貸すのに適したものは見つかりませんでした。

これまでのすべての助けに感謝します!繰り返しになりますが、これについてもすべての助けをいただければ幸いです。

4

3 に答える 3

2

すべてがスーパービューから削除されますか?また、交換してみてください

 MPMoviePlayerController *movieDone = [notification object];

 MPMoviePlayerController *movieDone = (MPMoviewPlayerController *)[notification object];

また、追加します

movieDone = nil;

MPMoviePlayerControllerがsuperViewから完全に削除されていることを確認するには、ビデオの再生が終了した後、ビューのボタン(MPMoviePlayerControllerを追加する前に作成)を押して、起動するかどうかを確認してください。ナビゲーションコントローラーは、MPMoviewPlayerControllerをモーダルに提示するか、プッシュする必要があります。モーダルで表示される場合は、再生が終了したら閉じてみてください。

于 2012-10-25T08:54:56.423 に答える
1

問題の原因は、ストーリーボードでの「自動レイアウト」の使用でした。映画を再生した後ではなく、再生した後に問題が発生する理由は100%わかりません。ただし、次のいずれかで修正しました。

A:自動レイアウトの削除

また

B:最終的に機能するまで制約関数で遊んでいます。(UIImageViewの高さを0に変更し、Equals: Default優先度が可能な限り低くなるように変更します。)

于 2012-11-10T09:28:27.827 に答える
0

SetUserInteractionEnabledメソッドでofselfおよび/またはself.scrollviewtoをYES設定してみてくださいmoviePlayBackDidFinish。また、スクロールビューのContentSizeプロパティのサイズをチェックして、サイズが実際の画面サイズよりも大きいかどうかを確認し、それがスクロールビューの機能を中断させているかどうかを確認します。

于 2012-10-25T07:32:04.780 に答える