项目场景:

手机为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到另一个控制层进行播放的,因为需要小屏和全屏播放更丝滑一点,没有采用另一个方案.

iOS16灵动岛横屏视频播放适配(ZFPlayer)相关推荐

  1. iOS16.1 实时活动 (Live Activity)灵动岛适配

    iOS16.1 实时活动 (Live Activity)&灵动岛适配 前言 说明 场景限制及建议(节选自参考文献1) 灵动岛适配必要性(节选自参考文献1) 开发基础知识(节选自参考文献2) 实 ...

  2. 盒马 iOS Live Activity “灵动岛”配送场景实践

    作者:陈振港.李凯 苹果在 WWDC22 中,提出了实时活动(Live Activity)的概念,以便于用户在锁屏查看一些应用实时活动的更新,这与盒马的配送场景十分贴合.因此,我们将 Live Act ...

  3. iOS灵动岛【电商秒杀】开发实践

    一.基本概述 名词基础知识 苹果在 iPhone 14 Pro 系列中增加一个灵动岛,主要目的是隐藏挖孔造型的高端"感叹号屏". 通过动画的视觉差异,用户找不到原来的挖孔屏.灵动岛 ...

  4. iPhone 14 Pro灵动岛创意 app,还能养宠物

    9 月 17 日,苹果开发者 Christian Selig 展示了一款以 " 灵动岛 " 为基础制作的应用,玩家们可以通过这款应用体验在 " 挖槽屏 " 养电 ...

  5. Flutter桌面小工具 -- 灵动岛【Windows+Android版本】

    通过此篇文章,你将了解到: Flutter动画实现灵动岛: Flutter如何开发一个置顶可自由拖拽的小工具: 分享一些关于灵动岛的想法. ⚠️本文为稀土掘金技术社区首发签约文章,14天内禁止转载,1 ...

  6. Android 版灵动岛插件上线;iPhone 15或将改名,并改用USB-C接口;​Swift 5.7 发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  7. 如何用墨刀画出iPhone灵动岛?

    如果说产品经理画原型也有顶流的话,那最近的"顶流"非灵动岛莫属了!苹果将挖孔屏幕用 UI 进行优化,让屏幕缺口不再是一种累赘,而是一种有趣的交互.它通过UI的方式,把感叹号挖孔改造 ...

  8. Compose 动画艺术探索之灵动岛

    本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究! 本篇文章是此专栏的第五篇文章,本篇文章应该是此专栏中最后一篇直接关于动画的文章了,之后文章中可能会提到,但应 ...

  9. 互联网晚报 | 1/12 星期四 | 微信回应切断抖音外链;爱奇艺App限制投屏;iPhone 16 Pro或取消灵动岛摄像头...

    微信回应切断抖音外链:坚决打击给用户造成诱导.骚扰的外链  1月10日晚间,第一财经独家报道抖音链接目前在微信内既无法直接打开.也无法复制完成跳转,甚至要通过图片OCR识别进行文字提取的情况.但微信内 ...

最新文章

  1. centos设置网络自动启动
  2. 笔记本nc10装linux,绝配:Ubuntu 9.04与上网本(NC10)
  3. [笔记]C#基础入门(十四)——C#用流程图描述程序逻辑
  4. 程序清单3-1 测试能否对标准输入设置偏移量
  5. 【渝粤教育】国家开放大学2018年秋季 0691-21T物理化学及实验 参考试题
  6. 推文科技:AI解决方案助力内容出海
  7. vue if判断_vue循环判断
  8. 高效新思路!实例分割算法!腾讯、华科出品!入选ICCV 2021!
  9. SVN服务器的本地搭建和使用
  10. java 序列化 serialVersionUID 的作用 和 两种添加方式
  11. linux内核符号地址,Linux内核-模块专用地址空间
  12. java错误找不到符号怎么办_java错误找不到符号
  13. MobSF分析.ipa文件,MobSF分析iOS app
  14. 创业公司天使轮、A轮、B轮、IPO融资时股权问题
  15. 计算机网络(第7版)第二章(应用层)知识点整理
  16. 网页中的虚线怎么做?
  17. 强大的虚拟音频器:Loopback for Mac
  18. html实现轮播图--小圆圈呈中间大两边小的样式
  19. 关于在caddy环境下,使用https协议UC无法下载的解决方法。
  20. 2021年了,还没找到合适的报表软件?来看看这几款报表软件!

热门文章

  1. vue+elementUI使用Wavesurfer.js音频可视化
  2. 第一篇 javase时钟表
  3. 如何搭建企业培训平台
  4. reCAPTCHA v3 验证
  5. JAVA:求大于200的最小质数
  6. 各种技术网站整合与搜索技巧
  7. 【翻译】天机芯Nature_Towards artificial general intelligence with hybrid Tianjic chip architecture
  8. latex参考文献bib基本格式_在Latex中使用Bibtex生成参考文献
  9. Vue RSA加密和解密
  10. 为什么CDMA需要对整个网络同步