iOS16灵动岛横屏视频播放适配(ZFPlayer)

article/2025/8/28 3:03:50

项目场景:

手机为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<ZFPlayerMediaPlayback>  _Nonnull asset, ZFPlayerLoadState loadState) {};}];self.playerControlView.playerPlayTimeChanged = ^(id<ZFPlayerMediaPlayback>  _Nonnull asset, NSTimeInterval currentTime, NSTimeInterval duration) {@strongify(self);};[self.playerControlView setPlayerDidToEnd:^(id<ZFPlayerMediaPlayback>  _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到另一个控制层进行播放的,因为需要小屏和全屏播放更丝滑一点,没有采用另一个方案.


http://chatgpt.dhexx.cn/article/816X3Ggh.shtml

相关文章

ZFPlayer视频播放PC 安卓都可以正常 播放,iOS端只有声音没有画面

1.添加视频&#xff0c;选择MP4格式 2.设置输出配置&#xff0c;并选择输出文件夹&#xff0c;视频编码为AVC(H264)&#xff0c;屏幕大小调整为720*480 3&#xff0c;点击开始 视频会出现在指定文件夹。可配置自定义文件夹 用格式工厂帮忙转个格式可以得出能播放和不能播放的区…

ZFPlayer 源码解读

源码下载地址&#xff1a;https://github.com/renzifeng/ZFPlayer 之前自己实现过一个模仿百思不得姐的demo https://github.com/agelessman/FFmpegAndKxmovieDemo 由于有朋友推荐&#xff0c;看了下ZFPlayer&#xff0c;觉得功能和封装都写的很好&#xff0c;就把源码看了一遍…

iOS开发-ZFPlayer的简单使用 播放单个网络视频

iOS开发-ZFPlayer的简单使用 播放单个网络视频 前言开发准备代码注意 前言 关于ZFPlayer播放单个网络视频案例&#xff0c;它的网络列表视频案例在gitHub上面很多。 开发准备 podfile导入 pod ZFPlayer, ~> 3.3.3 #, ~> 3.2.17 # 视频播放 pod ZFPlayer/ControlView p…

关于ZFPlayer集成播放 rtmp 视频流的总结

最近公司项目需要能够播放 rtmp 格式的直播流地址的播放器,安卓那边是买了人家的三方库,EasyPlayer,但是不想再买一个 ios 的了所以需要自己去找免费的合适的播放器去集成,终于在 github 上找到一个合适的了,那就是 强大的IJKPlayer 播放器;但在集成的时候出现了一些问题,朋友推…

ZFPlayer 播放器调用addPlayerViewToSmallFloatView开小窗播放样式错误以及无法关闭处理

ZFPLayer 是一款强大开源的视频播放器&#xff0c;在结合列表播放滑动超出当前视频范围调用 addPlayerViewToSmallFloatView开启小窗播放(类似画中画&#xff0c;但没有其强大和友好的交互)布局错误并且右上角的关闭按钮也没法关闭&#xff0c;错乱参考图如下&#xff1a; 1、样…

ios html zfplayer,【iOS】ZFPlayer源码解读中

前言 本篇继ZFPlayer源码解读基础之上&#xff0c;主要解析说明控制层与播放器&#xff0c;因为在上篇文章至现在并未提及丝毫关于这两个类业务的实现。 首先说下这两个类各自的职责。 控制层&#xff1a;主要负责响应与用户之间的交互&#xff0c;如手势控制的播放&#xff0c…

ZFPlayer iOS16 系统横屏全屏问题处理

iOS16 以后 通过原始横屏的方法已经不好使了&#xff0c;需要在此基础上添加 setNeedsUpdateOfSupportedInterfaceOrientations 方法的调用&#xff0c;具体API 描述如下&#xff1a; 回到主题&#xff0c;在使用ZFPlayer 视频库全屏播放时iOS16系统下的处理参考如下&#xff…

iOS使用ZFPlayer 实现视频播放

文章目录 ZFPlayer 视频播放使用1 创建 ZFAVPlayerManager 对象2创建containerView, 也就是视频视图的父视图3 创建 controllView4 创建 ZFPlayerController播放视频判断视频的横竖 ZFPlayer 视频播放使用 1 创建 ZFAVPlayerManager 对象 ZFAVPlayerManager *manager [[ZFAVP…

配置分离式LANP源代码编译实例

一、php编译 配置apache-2.4.9以fpm方式的php-5.4.26&#xff08;php服务器IP为172.16.3.30&#xff09; 1、编译php #tar xf php-5.4.26.tar.bz2 #cd php-5.4.26 # ./configure --prefix/usr/local/php --with-mysql/usr/l…

Centos使用Docker搭建Lanp环境

前言 LAMP 指的Linux(操作系统)、ApacheHTTP服务器&#xff0c;MySQL(有时也指MariaDB&#xff0c;数据库软件) 和 PHP(有时也是指Perl或Python)的第一个字母&#xff0c;集成环境方便&#xff0c;一般用来建立web应用平台 Docker 是一个开源的应用容器引擎&#xff0c;在doc…

LANP+KEEPALIVED集群(一)

lanpkeepalived集群 1、nginx模块与工作原理 (1)结构上分 基础模块&#xff1a;HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite 核心模块&#xff1a;HTTP模块、EVENT模块和MAIL模块 第三方模块&#xff1a;HTTP Upstream Request Hase模块、Notice模块和HT…

LANP+KEEPALIVED集群(二)

LANPKEEPALIVED集群&#xff08;二&#xff09; #基于不同域名 server { listen 80; server_name nginx.postfix.local; charset utf-8; access_log logs/domain.log main; location / { root html/domain; index domain.html; } error_page 500 502 503 504 /5…

LWIP网络协议基础

1、LWIP有3种编程接口&#xff1a;RAW&#xff08;裸机跑&#xff0c;不带操作系统&#xff09;、NETCONN和SOCKET(要带操作系统) 例程使用的是ucos小型操作系统&#xff0c;ucosii任务数限制了最大只能有255个任务&#xff08;其中0—空闲任务和254、255—系统任务不能用&…

LAN IP,WAN IP和Global IP

LAN IP&#xff0c;WAN IP和Global IP是与网络通信相关的三种IP地址&#xff0c;下面是它们的解释&#xff1a; LAN IP 局域网IP地址&#xff08;LAN IP&#xff09;&#xff0c;又称私有IP地址&#xff0c;是指对于一个私有网络环境内的主机所使用的IP地址。这些IP地址属于私…

一文读懂ssh,tomcat,LANP,LNMP,ftp,dns等常见的环境配置(运维工程师必看)

文章目录 一.网络服务的概述1.网络服务是什么2.网络服务有哪些&#xff08;进行简单的梳理&#xff09;3.网络服务学习建议 二.网络服务基础1.CentOS6与7的区别2.常见网络端口以及/etc/service文件3.网关和路由,主机名&#xff08;路由选择&#xff0c;网关&#xff0c;NAT解释…

ubuntu 上搭建lanp环境

2019独角兽企业重金招聘Python工程师标准>>> 1.安装tasksel sudo apt-get install tasksel 使用tasksel 时只需 sudo tasksel 2.安装lamp sudo tasksel instal lamp-server 打开浏览器输入127.0.0.1 可以看到apache首页 切换到/var/www/html(默认目录) 目录下新…

LANP环境编译设置

1.下载nginx-1.10.2 wget -O nginx-1.10.2.tar.gz http://nginx.org/download/nginx-1.10.2.tar.gz 2.安装nginx-1.10.2.tar.gz [rootxuegod64 ~]# yum in stall -y gcc gcc-c autoconf automake zlib zlib-devel openssl openssl-devel pcre-devel //zlib&#xff1a;给Ngin…

LANP平台搭建

【需要理解--lamp调用过程】 apache(libphp5.so) -> index.php(mysql.so)-> mysql ####################################################### 【配置yum】 mount /dev/cdrom /media vim /etc/yum.repos.d/yum.repo [base] namebase baseurlfile:///media/Server gpgch…

CentOS 7.4 YUM 搭建LANP环境+WordPress

CentOS YUM 搭建LANP环境Wordpress LAMP是什么呢&#xff1f; 其实就是一系列服务的简称 LAMP&#xff1a;LLinux&#xff0c;AApache&#xff0c;MMariadb/MySQL&#xff0c;PPHP LNMP&#xff1a;LLinux&#xff0c;NNginx&#xff0c;MMariadb/MySQL&#xff0c;PPHP LA…

lanp+nginx实现动静分离

因为apache处理动态页面能力比较高&#xff0c;nginx处理静态页面能力比较高&#xff0c;所以做动静分离来提高页面的访问速度。 系统环境&#xff1a; CentOS Linux release 7.9.2009 (Core) 脚本编译安装httpd-2.4.53 测试httpd服务 执行脚本安装mysql 验证mysql 执行脚本…