私は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ステートメントをコードに追加すると、viewDidAppear
scrollView.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
何も壊れていないようです。ただし、誤ったエラーステートメントに関しては、私は完璧主義者になる傾向があります。私はこれらのエラーについていくつかの調査を行いましたが、この状況で強力な手を貸すのに適したものは見つかりませんでした。
これまでのすべての助けに感謝します!繰り返しになりますが、これについてもすべての助けをいただければ幸いです。