iOS16灵动岛横屏视频播放适配(ZFPlayer)
创始人
2024-05-24 13:24:13
0

项目场景:

手机为iphone14Pro
版本iOS16.0.3
Xcode版本14.2
视频播放第三方库ZFPlayer


问题描述

使用视频时,视频播放自动横屏控制层的返回按钮和暂停按钮都点不到,上图错误、下图正确(控制按钮距离屏幕左右减小50、视频全屏不做改变)
在这里插入图片描述
在这里插入图片描述


原因分析:

  1. 全屏没有考虑灵动岛的范围,这里在屏幕旋转时重置控制层View的frame,全局持有ZFPlayerControlView控制层,将控制层左右缩小合适距离,我这里取得50

    self.controlView.frame = CGRectMake(50, 0, AKScreenHeight-100, AKScreenWidth);
    
  2. 注意在旋转回去时需要将高宽重置回去,重置相对于父容器的,所以是

    CGRectMake(0, 0, self.videoContainerView.width, self.videoContainerView.height)
    

解决方案:

关键代码:

self.playerControlView.orientationWillChange = ^(ZFPlayerController * _Nonnull player, BOOL isFullScreen){@strongify(self);dispatch_async(dispatch_get_main_queue(), ^{if(@available(iOS 16.0, *)){if(isFullScreen){self.controlView.frame = CGRectMake(50, 0, AKScreenHeight-100, AKScreenWidth);}else{self.controlView.frame = CGRectMake(0, 0, self.videoContainerView.width, self.videoContainerView.height);}}});};

全部代码:


#import "ZFAVPlayerManager.h"
#import "ZFPlayerController.h"//===================@property (nonatomic, strong) UIView *shadowView;
@property (nonatomic, strong) UIButton *playButton;
@property (nonatomic, strong) UIImageView *mainImageView;@property (nonatomic ,strong) UIView *videoContainerView;
@property (nonatomic, strong) NSString *mediaUrl;
@property (nonatomic, strong) UILabel *tips4GLabel;@property (nonatomic, strong) ZFPlayerController *playerControlView;//视频播放器
@property (nonatomic, strong) ZFAVPlayerManager *playerManager;
@property (nonatomic, strong) ZFPlayerControlView *controlView;//===================- (void)showVedioView{self.mediaUrl =@"http://xxxxx.mp4";//视频self.videoContainerView = [UIView new];self.videoContainerView.layer.cornerRadius = 4;[self.view addSubview:self.videoContainerView];self.mainImageView = [UIImageView new];[self.view addSubview:self.mainImageView];self.mainImageView.layer.cornerRadius = 4;self.mainImageView.clipsToBounds = YES;self.mainImageView.userInteractionEnabled = YES;self.mainImageView.contentMode = UIViewContentModeScaleAspectFill;self.mainImageView.hidden = NO;self.playerManager = [[ZFAVPlayerManager alloc] init];self.playerManager.scalingMode = ZFPlayerScalingModeAspectFit;/// 播放器相关self.playerControlView = [ZFPlayerController playerWithPlayerManager:self.playerManager containerView:self.videoContainerView];self.playerControlView.shouldAutoPlay = NO;self.playerControlView.pauseByEvent = YES;ZFPlayerControlView *controlView = [ZFPlayerControlView new];controlView.fastViewAnimated = YES;controlView.prepareShowLoading = YES;self.playerControlView.controlView = controlView;self.controlView = controlView;UIView *shadowView = [UIView new];shadowView.userInteractionEnabled = YES;[self.mainImageView addSubview:shadowView];shadowView.backgroundColor = ColorHexAlpha(@"#000000", 0.4);self.playButton = [UIButton buttonWithType:UIButtonTypeCustom];[self.mainImageView addSubview:self.playButton];[self.playButton setImage:[UIImage imageNamed:@"vedio_start_icon"] forState:UIControlStateNormal];@weakify(self);[[self.playButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {@strongify(self);self.playerControlView.assetURL = [NSURL URLWithString:self.mediaUrl];self.mainImageView.hidden = YES;self.videoContainerView.hidden = NO;self.playButton.hidden = YES;[self.playerControlView.currentPlayerManager play];self.playerControlView.playerLoadStateChanged = ^(id  _Nonnull asset, ZFPlayerLoadState loadState) {};}];self.playerControlView.playerPlayTimeChanged = ^(id  _Nonnull asset, NSTimeInterval currentTime, NSTimeInterval duration) {@strongify(self);};[self.playerControlView setPlayerDidToEnd:^(id  _Nonnull asset) {@strongify(self);self.mainImageView.hidden = NO;self.playButton.hidden = NO;self.videoContainerView.hidden = YES;}];self.playerControlView.orientationWillChange = ^(ZFPlayerController * _Nonnull player, BOOL isFullScreen){@strongify(self);dispatch_async(dispatch_get_main_queue(), ^{if(@available(iOS 16.0, *)){if(isFullScreen){self.controlView.frame = CGRectMake(50, 0, AKScreenHeight-100, AKScreenWidth);}else{self.controlView.frame = CGRectMake(0, 0, self.videoContainerView.width, self.videoContainerView.height);}}});};[self.videoContainerView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.equalTo(@16);make.right.equalTo(@(-16));make.top.equalTo(self.view).offset(323*FTGetScreenScale());make.height.offset(175*FTGetScreenScale());}];[self.mainImageView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.right.top.bottom.mas_equalTo(self.videoContainerView);}];[shadowView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.right.top.bottom.equalTo(@0);}];[self.playButton mas_makeConstraints:^(MASConstraintMaker *make) {make.centerX.equalTo(self.mainImageView);make.top.equalTo(self.mainImageView.mas_top).offset(85*FTGetScreenScale());make.width.equalTo(@(92*FTGetScreenScale()));make.height.equalTo(@(23*FTGetScreenScale()));}];UILabel *label = [[UILabel alloc] init];label.frame = CGRectMake(61, 432, 252, 20);[self.mainImageView addSubview:label];NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"当前为非无线网络环境,请注意流量消耗"attributes: @{NSFontAttributeName: [UIFont fontWithName:@"PingFangSC-Medium" size: 14*FTGetScreenScale()],NSForegroundColorAttributeName: [UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1.00],}];label.attributedText = string;label.textAlignment = NSTextAlignmentLeft;self.tips4GLabel = label;NSInteger status = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).networkStatus;if (status == 1) {// 流量提示self.tips4GLabel.hidden = NO;self.playButton.hidden = NO;}else{self.tips4GLabel.hidden = YES;self.playerControlView.assetURL = [NSURL URLWithString:self.mediaUrl];self.mainImageView.hidden = YES;self.videoContainerView.hidden = NO;self.playButton.hidden = YES;[self.playerControlView.currentPlayerManager play];}[label mas_makeConstraints:^(MASConstraintMaker *make) {make.centerX.equalTo(self.mainImageView);make.top.equalTo(self.mainImageView.mas_top).offset(52.5*FTGetScreenScale());make.width.equalTo(@(252*FTGetScreenScale()));make.height.equalTo(@(20*FTGetScreenScale()));}];}

oc版本的,Swift请自己再转一下。也有新push到另一个控制层进行播放的,因为需要小屏和全屏播放更丝滑一点,没有采用另一个方案.

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...