this、this、またはthisのようないくつかの質問と回答を読んだ後、いくつか言及すると、4 つの UIView を持つ UIScrollView を作成しようとしました。
これらの各 UIView 内で、MPMoviePlayerController を作成しています。
Apple のドキュメントには、次のように明確に記載されています。
Note: Although you may create multiple MPMoviePlayerController objects and present
their views in your interface, only one movie player at a time may play its movie.
そのため、ユーザーがスクロールすると、playersArray に格納されているさまざまな MPMoviePlayerControllers を一時停止して再生しています。UIScrollViewDelegate プロトコルから 2 つのメソッドを呼び出してこれを行います。
scrollViewWillBeginDragging: - このメソッドで、ユーザーが別のビューにスクロールしていることを検出したので、現在の MPMoviePlayerController を一時停止し、ムービーの現在の再生時間でサムネイル画像を挿入します。
scrollViewDidEndDecelerating: - ここでは、ユーザーがスクロールを停止したビューを取得するため、最初にサムネイルを非表示にしてから、その特定のビューから MPMoviePlayerController を再生します
これが私がそれを達成した方法です:
私の .h:
@interface ViewController : UIViewController<UIScrollViewDelegate,UIGestureRecognizerDelegate>
@property(strong,nonatomic) NSMutableArray * viewsArray;
@property(strong,nonatomic) UIScrollView * myScrollView;
@property int numberOfViews;
@property(strong,nonatomic) NSMutableArray * playersArray;
@end
私のviewDidLoad:
- (void)viewDidLoad
{
[super viewDidLoad];
//The number of views inside myScrollView
numberOfViews = 4;
//Initialization
viewsArray = [[NSMutableArray alloc] init];
myScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
playersArray = [[NSMutableArray alloc] init];
NSMutableArray * videoNamesArray = [[NSMutableArray alloc] initWithObjects:@"field4min",@"water4min",@"beach4min",@"bushtails4min", nil];
//Customization
myScrollView.delaysContentTouches = NO;
myScrollView.contentSize = CGSizeMake(myScrollView.frame.size.width * numberOfViews, myScrollView.frame.size.height);
myScrollView.delegate = self;
myScrollView.showsHorizontalScrollIndicator = YES;
myScrollView.pagingEnabled = YES;
myScrollView.userInteractionEnabled = YES;
myScrollView.bounces = NO;
myScrollView.showsHorizontalScrollIndicator = NO;
//Create the views that will populate the scrollView
for (int i = 0; i < numberOfViews; i++) {
UIView *cView = [[UIView alloc] init];
//Set the frame for each view inside the ScrollView
CGRect frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height);
frame.origin.x = frame.size.width * i;
cView.frame = frame;
//Set the path of the video to the MPMoviePlayerController
NSString * videoPath = [videoNamesArray objectAtIndex:i];
NSString *path = [[NSBundle mainBundle] pathForResource:videoPath ofType:@"mp4"];
MPMoviePlayerController * player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:path]];
//Customization
player.fullscreen = NO;
player.scalingMode = MPMovieScalingModeAspectFill;
[player.view setFrame:self.view.bounds];
player.controlStyle = MPMovieControlStyleNone;
player.shouldAutoplay = NO;
player.view.clipsToBounds = YES;
[player prepareToPlay];
[player stop];
//Get the image from the currentPlaybackTime to set it above the player
UIImage *thumbnail = [player thumbnailImageAtTime:[player currentPlaybackTime] timeOption:MPMovieTimeOptionNearestKeyFrame];
UIImageView *thumbnailView = [[UIImageView alloc] initWithFrame:player.view.frame];
[thumbnailView setImage:thumbnail];
[thumbnailView setContentMode:UIViewContentModeScaleAspectFill];
thumbnailView.clipsToBounds = YES;
//Add both views (player.view, and ImageView) to the currentView
[cView addSubview:player.view];
[cView addSubview:thumbnailView];
//Add the view to myScrollView
[myScrollView addSubview:cView];
//Add the player and the currentView to arrays for further manipulation
[playersArray addObject:player];
[viewsArray addObject:cView];
}
//add the ScrollView to the ViewController's view
[self.view addSubview:myScrollView];
}
私のscrollViewWillBeginDragging:
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
//Get the view (page) that is currently showing in the screen, inside the scrollView
static NSInteger previousPage = 0;
CGFloat pageWidth = scrollView.frame.size.width;
float fractionalPage = scrollView.contentOffset.x / pageWidth;
int page = lround(fractionalPage);
NSLog(@"page: %i",page);
previousPage = page;
//Get the current player from playerArray
MPMoviePlayerController * startPlayer = [playersArray objectAtIndex:page];
//Pause the player;
[startPlayer pause];
//Get the thumbnail from the currentPlaybackTime
UIImage *thumbnail = [startPlayer thumbnailImageAtTime:[startPlayer currentPlaybackTime] timeOption:MPMovieTimeOptionExact];
UIImageView *thumbnailView = [[UIImageView alloc] initWithFrame:startPlayer.view.frame];
[thumbnailView setImage:thumbnail];
//Customization
[thumbnailView setContentMode:UIViewContentModeScaleAspectFill];
thumbnailView.clipsToBounds = YES;
//Get the second view (thumbnail) from the view.subviews array and unhide it (I hide it in scrollViewDidEndDecelerating method)
UIView * startView = [viewsArray objectAtIndex:page];
UIView * imagestartView = [startView.subviews objectAtIndex:1];
imagestartView.hidden = NO;
imagestartView = thumbnailView;
}
私のscrollViewDidEndDecelerating:
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//Get the view (page) that is currently showing in the screen, inside the scrollView
static NSInteger previousPage = 0;
CGFloat pageWidth = scrollView.frame.size.width;
float fractionalPage = scrollView.contentOffset.x / pageWidth;
int page = lround(fractionalPage);
NSLog(@"pageend: %i",page);
previousPage = page;
//Get the current player from playerArray and play it
MPMoviePlayerController * endPlayer = [playersArray objectAtIndex:page];
[endPlayer play];
//Get the second view (thumbnail) from the view.subviews array and hide it
UIView * endView = [viewsArray objectAtIndex:page];
UIView * imageEndView = [endView.subviews objectAtIndex:1];
imageEndView.hidden = YES;
}
私の問題:
iOS 6 シミュレーターで実行すると意図したとおりに動作しますが、デバイス (iOS 5.1 を搭載した iPhone) で実行するとすぐに、中央のビュー (viewsArray のインデックス 1 と 2) にビデオが表示されません。 、音だけ...
私は何が欠けていますか?
どんな助けでも大歓迎です。