iOS开发高仿抖音,上下切换、横竖屏播放!

本文介绍如何模仿抖音实现上下滑动切换视频播放的功能。通过UITableView展示视频第一帧,封装视频播放View,监听currentIndex变化,处理滑动代理动画,以及确保只存在一个视频播放实例以优化性能。文中还提到需要获取麦克风和相册权限,并提供了部分代码实现。
摘要由CSDN通过智能技术生成

好久没写文章了,最近有点时间,模仿了一个抖音视频上下滑动切换播放功能,顾记录下实现方案,共勉。

一、先说下大致思路:
1.UITableView : Cell上展示视频第一帧图片,点赞,评论,头像等参数
2.封装一个视频播放View
3.定义一个属性currentIndex,并添加他的观察属性,当currentIndex属性值改变时,处理视频播放功能
4.UITableView滑动代理,处理视频上下滑动动画操作
5.注意,整个UITableView中,只存在一个视频播放实例方法,这样性能提升
直播功能的界面展示,也同样处理逻辑

开始之前,info.plist 需要增加麦克风,相册权限

因为是demo,所有代码怎么简单怎么来,谅解!!!

下面是具体代码,供参考,自己直接copy到项目中就可以用,如有需要再讲代码上传都codding

涉及图片资源,自己随便找个图顶下就行

欢迎关注公众号:编程大鑫,进群大家一起交流进步!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bi9YqM5B-1627022506398)(//upload-images.jianshu.io/upload_images/2151291-109c6326a56f2eaa.png?imageMogr2/auto-orient/strip|imageView2/2/w/722/format/webp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DH4vadJr-1627022506399)(//upload-images.jianshu.io/upload_images/2151291-699b477a4032ba83.png?imageMogr2/auto-orient/strip|imageView2/2/w/722/format/webp)]

二、代码实现
1,HomeController.h类中

#import "HomeController.h"
#import "VideoTableCell.h" //自定义Cell
#import "VideoView.h" 

//位置:松开后切换视频
#define offsetY 100  

@interface HomeController ()<UITableViewDataSource,UITableViewDelegate>{

    UITableView * table;
    NSArray * dataArray; //存放视频url
    NSMutableArray * videoPicArray;//视频第一帧图片,真实情况下后台会返回图片第一帧url
}

@property(nonatomic,strong)VideoView * videoView;//视频播放器
@property(nonatomic,assign)NSInteger currentIndex;//当前tableview indexPath

@end

@implementation HomeController

- (void)viewDidLoad {

    [super viewDidLoad];

    [self initData];

    [self setupView];

//获取视频第一帧
    dispatch_async(dispatch_get_global_queue(0,0), ^{

        for (int i = 0; i < self->dataArray.count;i++) {

            UIImage * image = [self getVideoPreViewImage:[NSURL URLWithString:self->dataArray[i]]];

            [self->videoPicArray replaceObjectAtIndex:i withObject:image];

            dispatch_async(dispatch_get_main_queue(), ^{
                [self->table reloadData];
            });
        }
    });
}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

//进入界面时,播放
    if(self.videoView){

        [self.videoView play];
    }
}

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];

//离开时暂停播放
    if(self.videoView){

        [self.videoView pause];
    }
}

-(void)initData{

    dataArray=@[
        @"https://aweme.snssdk.com/aweme/v1/play/?video_id=ba8f4ff0c1fe445dbfdc1cc9565222fa&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0",
        @"http://ctgdev.oss-cn-shanghai.aliyuncs.com/zys/04795f79-697b-4647-958b-fed0261b2730.mp4",
        @"https://aweme.snssdk.com/aweme/v1/play/?video_id=ba8f4ff0c1fe445dbfdc1cc9565222fa&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0",
        @"http://ctgdev.oss-cn-shanghai.aliyuncs.com/zys/04795f79-697b-4647-958b-fed0261b2730.mp4",
        @"https://aweme.snssdk.com/aweme/v1/play/?video_id=ba8f4ff0c1fe445dbfdc1cc9565222fa&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0"];

    videoPicArray=[NSMutableArray array];

    for(int i=0;i<dataArray.count;i++){

        [videoPicArray addObject:[UIImage imageNamed:@"img_video_loading"]];
    }
}

-(void)setupView{

    navView.backgroundColor=MS_RGBA(0, 0, 0, 0);

    UILabel * liveLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, StatusHeight+10, 60, 20)];
    liveLabel.text=@"直播";
    liveLabel.font=[UIFont boldSystemFontOfSize:16];
    liveLabel.textAlignment=NSTextAlignmentCenter;
    liveLabel.textColor=[UIColor whiteColor];
    [navView addSubview:liveLabel];

    CGFloat leftX = (SCREEN_WIDTH-150)/3;

    UILabel * locationLabel = [[UILabel alloc] initWithFrame:CGRectMake(leftX+50, StatusHeight+10, 50, 20)];
    locationLabel.text=@"本地";
    locationLabel.font=[UIFont systemFontOfSize:17];
    locationLabel.textAlignment=NSTextAlignmentCenter;
    locationLabel.textColor=[UIColor whiteColor];
    [navView addSubview:locationLabel];

    UILabel * likeTitle = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(locationLabel.frame), StatusHeight+10, 50, 20)];
    likeTitle.text=@"关注";
    likeTitle.font=[UIFont systemFontOfSize:16];
    likeTitle.textAlignment=NSTextAlignmentCenter;
    likeTitle.textColor=[UIColor whiteColor];
    [navView addSubview:likeTitle];

    UILabel * hotTitle = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(likeTitle.frame), StatusHeight+10, 50, 20)];
    hotTitle.text=@"推荐";
    hotTitle.font=[UIFont boldSystem
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值