登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

滚动播放视频 播放完毕自动滚动播放下一个视频

[复制链接]
来自: 小佛塔 分类: iOS精品源码 上传时间: 2017-12-26 13:54:09
Tag:

项目介绍:

基于XLVideoPlayer的自动滚动视频播放

image

核心代码

判断显示中的cell哪个是最佳的显示位置

- (void)filterShouldPlayCellWithScrollDirection:(BOOL)isScrollDownward
{
    //顶部
    if (self.tableView.contentOffset.y<=0) {
        //其他的已经暂停播放
    if (self.lastOrCurrentPlayIndex==-1) {
        [self playVideoWithShouldToPlayIndex:0];
    }else{
        //第一个正在播放
        if (self.lastOrCurrentPlayIndex==0) {
        return;
        }
        //其他的没有暂停播放,先暂停其他的再播放第一个
        [self stopVideoWithShouldToStopIndex:self.lastOrCurrentPlayIndex];
        [self playVideoWithShouldToPlayIndex:0];
    }
        return;
    }
    
    //底部
    if (self.tableView.contentOffset.y+self.tableView.frame.size.height+1>=self.tableView.contentSize.height) {
        //其他的已经暂停播放
        if (self.lastOrCurrentPlayIndex==-1) {
            [self playVideoWithShouldToPlayIndex:self.dataArray.count-1];
        }else{
            //最后一个正在播放
            if (self.lastOrCurrentPlayIndex==self.dataArray.count-1) {
                return;
            }
            //其他的没有暂停播放,先暂停其他的再播放最后一个
            [self stopVideoWithShouldToStopIndex:self.lastOrCurrentPlayIndex];
            [self playVideoWithShouldToPlayIndex:self.dataArray.count-1];
        }
        return;
    }
    
    [self stopVideoWithShouldToStopIndex:self.lastPlayCell];
    
    //中部(找出可见cell中最合适的一个进行播放)
    NSArray *cellsArray = [self.tableView visibleCells];
    NSArray *newArray = nil;
    if (!isScrollDownward) {
        newArray = [cellsArray reverseObjectEnumerator].allObjects;
    }else{
        newArray = cellsArray;
    }
    [newArray enumerateObjectsUsingBlock:^(ScrollPlayVideoCell *cell, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"播放视频 %ld",(long)cell.row);
        
        CGRect rect = [cell.videoFirstImageView convertRect:cell.videoFirstImageView.bounds toView:self];
        CGFloat topSpacing = rect.origin.y;
        CGFloat bottomSpacing = self.frame.size.height-rect.origin.y-rect.size.height;
        if (topSpacing>=-rect.size.height/3&&bottomSpacing>=-rect.size.height/3) {
            if (self.lastOrCurrentPlayIndex==-1) {
                if (self.lastOrCurrentPlayIndex!=cell.row) {
                    [self cellPlay:cell];
                }
            }
            *stop = YES;
        }else{
            [self stopVideoWithShouldToStopIndex:cell.row];
        }
    }];
}

让指定的cell播放视频

    -(void)cellPlay:(ScrollPlayVideoCell *)cell{
    
        if(self.dataArray.count<=0){
            return;
        }
    
        NSIndexPath *path = [NSIndexPath indexPathForRow:cell.row inSection:0];
    
        __weak typeof(self) weakSelf = self;
        __weak XLVideoPlayer *beplayer = _player;
        if (_player && cell.row == self.lastPlayCell) {
        return;
        }
    
        [_player removeFromSuperview];
    
        _player = [[XLVideoPlayer alloc] init];
        _player.completedPlayingBlock = ^(XLVideoPlayer *player) {
    
        if (weakSelf.lastPlayCell != weakSelf.dataArray.count-1) {
            if(weakSelf.tableView.contentOffset.y + cellHeigh + weakSelf.tableView.frame.size.height > weakSelf.tableView.contentSize.height){
    
                [weakSelf.tableView setContentOffset:CGPointMake(0, weakSelf.tableView.contentSize.height  -weakSelf.tableView.frame.size.height) animated:YES];
    
                NSLog(@"滑动到最后一个视频 %f",weakSelf.tableView.contentSize.height  -weakSelf.tableView.frame.size.height);
    
            }else if(weakSelf.tableView.contentOffset.y + cellHeigh + weakSelf.tableView.frame.size.height < weakSelf.tableView.contentSize.height){
    
                [weakSelf.tableView setContentOffset:CGPointMake(0, weakSelf.tableView.contentOffset.y + cellHeigh) animated:YES];
                NSLog(@"滑动到下一个视频 %f",weakSelf.tableView.contentOffset.y + cellHeigh);
            }else{
                    //直接播放下一个 因为当前位置正好等于播放最后一条的位置 所以不再执行设置contentOffset的方法
                    [weakSelf playNext];
                    }
            }
                    [beplayer setStatusBarHidden:NO];
        };
    
        _player.slider.value = 0;
        _player.videoUrl = cell.model.mp4_url;// item.mp4_url;
        [_player playerBindTableView:self.tableView currentIndexPath:path];
        _player.frame = cell.videoBackView.bounds;
        [_player.player play];
        //在cell上加载播放器
        [cell.contentView addSubview:_player];
    
        self.lastOrCurrentPlayIndex = cell.row;
        self.lastPlayCell = cell.row;
        cell.topblackView.hidden = YES;
    }

调用时机:滚动停止的时候;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    //判断滚动方向
    if (scrollView.contentOffset.y>self.lastScrollViewContentOffsetY) {
        self.isScrollDownward = YES;
    }else{
        self.isScrollDownward = NO;
    }
    self.lastScrollViewContentOffsetY = scrollView.contentOffset.y;

    //停止当前播放的
    [self stopCurrentPlayingCell];

    //找出适合播放的并点亮
    [self filterShouldLightCellWithScrollDirection:self.isScrollDownward];
}

-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{

    if (velocity.y >0 || velocity.y < 0) {
        rate = YES;
    }else{
        rate = NO;
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    if (rate == YES) {
        //停止的时候找出最合适的播放
        NSLog(@"滑动停止时播放1");
        [self filterShouldPlayCellWithScrollDirection:self.isScrollDownward];
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    if(decelerate == NO){
        //停止的时候找出最合适的播放
        NSLog(@"滑动停止时播放2");
        [self filterShouldPlayCellWithScrollDirection:self.isScrollDownward];
    }
}

//setContentOffset: animation:
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
    [self playNext];
}

播放下一个视频

-(void)playNext{

    //中部(找出可见cell中最合适的一个进行播放)
    NSArray *cellsArray = [self.tableView visibleCells];
    [self stopVideoWithShouldToStopIndex:self.lastPlayCell];

    for (ScrollPlayVideoCell *cell in cellsArray) {

        if (cell.row == self.lastPlayCell + 1) {
            NSLog(@"播放下一个视频: %ld",(long)cell.row);
            [self cellPlay:cell];
            break;
        }
    }
}

相关源码推荐:

我来说两句
*滑动验证:
所有评论(72)
小佛塔 2017-12-26 13:55:20
正需要啊,感谢楼主无私分享!
回复
逆鳞九霄 2017-12-27 15:45:30
感谢分享,Code4App有你更精彩:)
回复
逆鳞九霄 2017-12-27 15:46:08
很给力,Code4App有你更精彩!
回复
AlonMessi 2017-12-27 15:46:20
感谢大神分享,必须顶!
回复
kengsir 2017-12-27 15:46:53
小弟学习了~支持,支持
回复
hellokenken 2017-12-27 15:47:00
感谢分享,楼主V5~
回复
BlueManlove 2017-12-27 15:47:33
我是来学习的
回复
littleRed 2017-12-27 15:47:37
感谢分享,楼主V5~
回复
phoiu 2017-12-27 15:47:53
相当不错,感谢无私分享精神!
回复
提取码:  下载次数:133 状态:已购或VIP 售价:0(原价:15)金钱 下载权限:初级码农 
874 1 133
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表