2

thisthis、または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) にビデオが表示されません。 、音だけ...

私は何が欠けていますか?

どんな助けでも大歓迎です。

4

0 に答える 0