优酷响应式在消费场景的落地 iOS | 《优酷响应式布局技术全解析》第六章

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本章介绍 优酷响应式在消费场景的落地 iOS

上一章:优酷APP响应式布局在消费场景的落地Android | 《优酷响应式布局技术全解析》第五章>>>
下一章:优酷APP响应式布局之测试方案 | 《优酷响应式布局技术全解析》第七章>>>

作者| 阿里巴巴文娱技术 金籽

一、背景

随着科技的进步,硬件设备的类型也是百花齐放,出现了各种各样的大屏设备及屏幕模式,单独APP去支撑大尺寸设备成本太高,一套代码高效支撑不同尺寸的硬件设备成为了一种趋势。在此背景下,优酷应用技术团队进行了响应式开发,播放页场景的适配重点是围绕播放器进行的,大屏设备下播放器应该如何布局、内容分发应该如何布局?下面将介绍优酷播放页在响应式适配上遇到的技术挑战及解决方案。

二、业务介绍

优酷主客消费场景即优酷App的播放页。播放页作为视频内容消费的落地页,主要提供视频播放及视频周边内容推荐,业务场景及页面内容都比较复杂。

1、 组件:即视频相关内容承载控件,包括简介,选集,周边视频,花絮视频,推荐视频等,通过这些内容让用户了解更多的视频相关的信息;

2、 半屏:包括Native、Weex、H5的半屏,通过半屏用户可以看到更多的视频相关内容,也可以承载视频互动。因为组件展示的内容还是有限,通过半屏可以更好更全地展示;

3、 Tab:通过Tab让用户在不同的内容之间切换;

4、 播放器上层:播放器交互相关功能,快进快退、下一集、清晰度、画中画等。

三、响应式与传统iPhone布局差异

image.png

如上图所示,播放页在iPhone设备上的布局比较简单,按照播放器的模式将播放页的状态分为以下几种:竖小屏模式、横全屏模式(横左全屏、横右全屏),依次对应上面的左图和右图。在竖小屏模式的时候上面是一个16:9的播放器下面是周边视频分发内容,当播放器切换到全屏模式的时候则变成一个全屏大小的播放器,整体策略简单清晰。但是iPad显示区域大大增加,如果简单的把iPhone端的布局移植过来显然是不合适的,如何有效的利用大屏设备的显示空间,提供更好的交互体验,才是响应式最终要解决的问题。

image.png

image.png

如上图所示,播放页在iPad上的布局就比较复杂了,按照播放器的模式将播放页分的状态分为以下几种:竖小屏模式、横小屏模式、横全屏模式(横左全屏、横右全屏),竖全屏模式,与iPhone端的主要区别是:

1、iPhone上小屏模式仅存在于设备方向是竖屏的时候(竖小屏模式),iPad上小屏模式既可以存在于设备方向是竖屏(竖小屏模式)也可以存在于设备方向是横屏(横小屏模式)对应的增加了一种横小屏模式;

2、iPhone上全屏模式仅存在于设备方向是横屏的时候,iPad上全屏模式既可以存在于设备方向是竖屏(竖全屏模式)也可以存在于设备方向是横屏(横全屏模式),对应的增加了一种竖全屏模式;

3、模式切换适配,由于新增加了横小平模式、竖全屏模式,那么不同模式之前的切换对应的也就增加了很多case,比如竖小屏模式切换到横小屏模式、竖全屏模式切换到横全屏模式;

4、iPad分屏特性,两个独立APP同时显示运行,举例屏幕上左边是我们优酷APP,右面可以是系统浏览器APP。

当前我们理清楚了iPhone和iPad的主要区别,同时也就明确了适配的重点,即小屏模式、竖全屏模式、模式切换、新增模式之间的切换、iPad分屏特性。

四、适配重点

1、小屏模式适配(横&竖小屏模式)

小屏模式适的配第一原则,重点关注大屏设备显示Window的宽度,根据不同设备显示Window的大小来确定播放器的大小,进而决定了整个页面的布局。优酷播放页适配的策略是如果当前大屏设备显示Window的宽度达到指定阀值,就会将整个播放页划分为两部分,左边可以看成是传统的iPhone布局(上面是一个16:9的播放器下面是周边视频分发内容),右边划归为互动区用于显示评论及播放页半屏,我们将这种布局称为分页模式。如果前大屏设备显示Window的宽度没有达到指定阀值,就是传统的iPhone布局(上面是一个16:9的播放器下面是周边视频分发内容)。

我们将整个计算逻辑抽象到一个分类中去管理,内部定义好分页模式宽度的阀值,根据这个阀值来确定当前是否处于分页模式、当前播放器的大小、右边互动区的大小,进而进行整个页面的布局

@interface UIScreen (YKRLPlayViewResponsive)
+ (CGFloat)playViewResponsiveWidth;      //播放器宽度
+ (CGRect)orientationCorrectedRect;      //设备尺寸
+ (CGFloat)rightExtraResponsiveWidth;    //分页模式下右边区域宽度
+ (BOOL)isRightExtraMode;                //是否处于分页模式下
@end

当响应式状态发生变化的时候,上面的方法(播放器尺寸、屏幕尺寸、右边区域宽度、是否分页)返回值对应的发生变化,此时根据这些变化去刷新页面布局

...
- (void)responsiveLayoutDidChange
{
    //更新播放器布局
    [self refreshPlayerLayout];
    
    //更新周边视频相关布局
    [self refreshPageLeftLayout];
    
    //更新分页模式下互动区布局
    [self refreshPageRightLayout];
}
...

页面布局的时候,通用的组件计算逻辑抽象成单例管理类YKDetailLayoutManager,方便复用及代码收口,后续如发生需求变化通用部分只需要在管理类中修改即可:

@interface YKDetailLayoutManager : NSObject

+(instancetype)sharedInstance;

//横滑组件,坑位正常宽度
-(CGFloat)horizontalComponentItemWidth;    

//横滑组件,坑位小模式宽度     
-(CGFloat)horizontalComponentItemWidthSmall; 

   
//相关组件,坑位单列模式宽度
-(CGFloat)aboutComponentSingleItemWidth;   

//相关组件,坑位多列模式宽度    
-(CGFloat)aboutComponentDoubleItemWidth; 

//选集组件,坑位宽度       
-(CGFloat)episodeComponentSeriesItemWidth;      
...
@end

小屏模式下播放页半屏适配,播放页半屏是播放页特有的一种展示,在iPhone上半屏处于播放器的下方并撑满屏幕宽度,响应式下最大的变更是如果当前处于分页模式下,播放页半屏将展示在屏幕的右侧区域上面,适配重点就是收口半屏Frame,当半屏页面初始化或者响应式状态变化的时候刷新半屏布局。

...
- (CGRect)halfViewFrame
{
case1:当前是分页模式,返回右边互动区的frame

case2:当前不是分页模式,返回播放器下面周边视频对应的frame

}
...

...
- (void)responsiveLayoutDidChange
{
    //获取半屏的frame
    CGRect halfFrame = [self halfViewFrame];
    
    //根据获得的半屏frame,刷新半屏布局
    [self refreshHalfViewWithFrame:halfFrame];
}
...

2、竖全屏模式适配

在iPhone上优酷播放器上层之前针对竖版视频推出过轻量级的竖全屏模式,只有竖版视频才存在这种状态,响应式布局在此基础上将这种模式推广到全部视频上,所以适配起来比较顺畅。

3、模式切换适配

在iPad上模式切换变得比较复杂,新增了一些iPone上并不存在的case,比如竖小屏模式切换到横小屏模式、横小屏模式切换到竖小屏模式、横全屏模式换到竖全屏模式、竖全屏模式切换到横全屏模式。我们的适配原则是:

1) 遵守播放器上层架构开发标准;
2) 对播放器上层架构侵入较小;
3) 代码聚合解耦。

最终方案是抽象出一个轻量级别的中间件来完成模式的切换,对原有架构实现无侵入插入,内部基本原理就是监听响应式的状态变化,根据当前的设备屏幕方向及当前播放页的模式,来动态改变播放页的模式并且刷新页面布局:

...
- (void)responsiveLayoutDidChange
{   

case1: 
当前设备是竖屏方向,当前模式是横左或横右全屏模式 , 主动切换到竖全屏模式

case2: 
当前设备是横左方向,当前模式是竖全屏模式, 主动切换到横左全屏模式

case3: 
当前设备是横右方向,当前模式是竖全屏模式, 主动切换到横右全屏模式

case4: 
横小屏模式和竖小屏模式之间切换, 要强制刷一下
 
}
...

4、分屏特性适配

iPad分屏特性如何处理呢?其实分屏只是动态的改变了显示Window的宽度,只要我们严格遵循原则按照Window的宽度去适配,上面的布局方式将会完美的应用于分屏特性,我们并不需要去做更多的工作来适配分屏。效果如下:

image.png

五、总结

1、响应式适配的时候尽量避免到处打patch,到处 if else 的去修改UI布局,原则上按照父 view大小来布局子view,也可以使用自动布局等方案进行适配;

2、尽最大努力实现同样代码,在iPhone和iPad上都能完美运行;

3、充分梳理好当前的技术架构,提炼出适合自己的技术方案,要充分考虑可扩展性、可维护性、性能等诸多前置条件;

4、相信在不久的将来,移动端APP将会流畅的运行在MAC笔记本上,全平台打通大有可为。

相关文章
|
15天前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度解析
在移动操作系统的战场上,安卓和iOS一直占据着主导地位。本文将深入探讨这两大平台的核心技术特性,以及它们如何影响用户的体验。我们将从系统架构、应用生态、安全性能和创新功能四个方面进行比较,帮助读者更好地理解这两个系统的异同。
45 3
|
21天前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
6天前
|
API Android开发 iOS开发
掌握安卓与iOS应用开发中的依赖注入技术
本文探讨了在安卓和iOS应用开发中,如何有效利用依赖注入技术来提升代码的模块化、可测试性和可维护性。通过对比分析两种平台下依赖注入的实现方式与工具,本文旨在为开发者提供一套清晰、实用的依赖管理策略,助力打造高质量软件产品。
|
14天前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度剖析
在移动操作系统的战场上,安卓和iOS一直是两个重量级选手。本文将深入探讨两者的技术架构、安全性、应用生态以及用户体验等方面的差异,并尝试从用户和开发者的角度出发,分析这两个系统的优势与不足。通过比较,我们不仅能更好地理解各自的特点,还能洞察未来移动技术的发展趋势。
|
23天前
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
2天前
|
搜索推荐 Linux Android开发
深入解析安卓与iOS系统架构设计差异
本文旨在探讨Android和iOS两大主流操作系统在架构设计上的根本差异。通过分析两种系统的设计理念、核心组件以及实际应用表现,揭示它们如何反映不同的开发哲学和用户体验策略。我们将从系统层级结构、内存管理机制、用户界面设计三个方面入手,逐一对比Android的开放性和灵活性如何与其对手iOS的封闭性和一致性相互辉映。
|
3天前
|
Android开发 Swift iOS开发
掌握安卓与iOS应用开发:关键技术与市场趋势
本文深入探讨了安卓和iOS平台的应用开发,通过分析关键技术如Kotlin、Swift及Flutter,并结合当前市场趋势,为开发者提供全面的技术指南。同时,比较了两大平台的优劣势,帮助开发者做出更明智的决策。
|
20天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
80 0
|
20天前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
23 0
|
22天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件

热门文章

最新文章

推荐镜像

更多