如何让一套代码适配所有iOS设备尺寸?

简介: 随着移动互联网设备和技术的发展,各种移动设备屏幕尺寸层出不穷,折叠屏、分屏、悬浮窗等等,面对越来越多样的屏幕,如果为每种尺寸单独进行适配,不仅费时费力,还会增加端侧代码的开发与维护压力。如何让一套代码适配所有尺寸变化,增强App的通用能力?阿里巴巴文娱技术 氚雨 将分享优酷APP在iOS响应式布局技术上的实践和落地。

image.png

响应式是基于同一套代码,开发一个APP能够兼容多尺寸、多终端设备的显示,能够动态调整页面的布局以及容器的布局,充分利用当前屏幕的尺寸,为用户提供更好的浏览体验,提升APP开发效率和迭代效率。

一 iOS布局尺寸预研

当下,iOS端的主要尺寸类型有五种:iPhone、iPad竖屏、iPad横屏、iPad浮窗、iPad分屏。通常,App是按iPhone尺寸开发的,需要适配剩余的四种iPad尺寸。

iPad横、竖屏比较常见,旋转设备即可,比较特殊的是浮窗和分屏模式。自苹果iPad iOS 9开始,用户在打开一个应用时,从最底部上滑打开Dock,即可拖拽另一个App进入浮窗模式:

640.gif

在支持分屏的iPad上拖拽到更边缘的地方即可开启分屏模式:

640 (1).gif

其中浮窗模式所有升级iOS 9的设备都支持,分屏模式只有最新版的硬件设备iPad mini 4、iPad Air 2及iPad Pro支持:

image.png

二 优酷iOS响应式方案

响应式布局的核心是设计统一的适配规则,并在屏幕尺寸发生变化时按布局规则重新布局,以适配不同屏幕尺寸,而大多数App在开发时一般只有适配iPhone的版本,在通过响应式适配更多机型时主要要解决三个方面的问题,即如何获取、更新响应式状态以进行对应的适配,如何计算在不同屏幕宽度下App内容的宽度、列数等布局参数,如何进行响应式下的数据处理以解决较难适配的组件、减少页面留白等,基于此我们开发了响应式布局SDK,负责统一管理响应式状态、处理布局逻辑、裁剪映射数据等。

image.png

1 响应式App配置

App除了配置为universal版之外,要支持浮窗或分屏模式还需要进行一些配置:

(1)需要提供LaunchScreen.storyboard作为启动图,由于App支持的运行尺寸太多,不再适合用图片作为启动图。

(2)需要在info.plist中配置支持所有屏幕方向:

image.png

(3)注意不能勾选Requires full screen配置项或配置UIRequiresFullScreen为YES,如此会声明App要求全屏运行,自然表示不支持浮窗或分屏:

image.png

(4)支持分屏要求App的主Window需要使用系统UIWindow,不能继承,并且要通过init方法或initWithFrame:[UIScreen mainScreen].bounds方式初始化。

通过以上步骤开启浮窗、分屏能力后,在App内就无法再通过相关代码控制设备方向,以往通过如下代码可控制ViewController为竖屏,而支持分屏后如下方法系统不再调用,默认所有ViewController支持所有屏幕方向:

image.png

如下强制设置屏幕方向的黑方法也已失效:

image.png

这种设计的主要原因是,当一个App支持分屏后,就不再单独占用整个屏幕,当另一个App同时运行时,同一块屏幕不可能出现一个横屏、另一个竖屏。此类问题没有完美的解决方案,为了保证用户体验,支持分屏的App必须所有页面适配所有屏幕方向,这也体现了苹果对用户体验的极致追求,参见DeveloperForums中开发人员的讨论:
https://developer.apple.com/forums/thread/19578

2 响应式SDK

响应式状态管理

响应式状态提供了当前是否开启响应式、响应式布局尺寸类型、当前布局window尺寸等相关状态量,响应式SDK会在屏幕尺寸变化后更新响应式状态,并通过系统通知和自定义通知机制,通知相关业务方。

// 响应式开启关闭状态
typedefNS_ENUM(NSInteger, YKRLLayoutStyle) {   YKRLLayoutStyleNormal =0,        // 响应式状态关闭   YKRLLayoutStyleResponsive =1,    // 响应式状态开启}; // 响应式屏幕尺寸类型,页面可依据此类型区分是否分屏等
typedefNS_ENUM(NSInteger, YKRLLayoutSizeType) {   YKRLLayoutSizeTypeS =0,      // eg. phone pad浮窗   YKRLLayoutSizeTypeL =1,      // pad   YKRLLayoutSizeTypeXL =2,     // 预留
}; // 响应式屏幕状态类型(一共有十种类型)
typedefNS_OPTIONS(NSUInteger, YKRLLayoutScreenType) {   YKRLLayoutScreenTypeUnknown = (1<<0),          //未知   YKRLLayoutScreenTypePortrait = (1<<1),         //竖屏全屏YKRLLayoutScreenTypeLandscapeLeft = (1<<2),    //横屏全屏左… …
};

响应式SDK声明了YKRLLayoutStyle、YKRLLayoutSizeType、YKRLLayoutScreenType三种枚举状态标记当前的响应式状态,分别表示响应式开启关闭状态,当前尺寸类型及具体屏幕类型,一般业务方只需要获取是否是响应式设备状态,对于在不同宽度下页面布局不一致的业务方可以通过尺寸类型状态进行区分适配,而对于需要具体知道当前屏幕状态的业务方可以通过屏幕类型获取,屏幕类型只包含当前iOS设备已支持的屏幕状态,随着设备类型的丰富,如出现折叠屏等,屏幕类型会作相应扩展。每当设备旋转或用户开启分屏时,响应式SDK都会在系统回调中更新当前响应式状态,并通知业务方响应式状态的改变。

响应式布局规则

优酷响应式布局规则主要包含列数适配规则、宽度适配规则等,比如多列均分组件的列数在不同屏幕宽度下是可变的,响应式SDK会根据当前的响应式状态输出合适的布局列数等,对于每一个布局规则,响应式SDK中都有相应的布局适配逻辑,响应式布局规则满足优酷App整体UI规范,业务方直接指定自己所需要的规则即可,除少数特殊规则之外,大部分布局规则都用于组件列数和组件宽度布局,此类响应式布局规则中会指定一个标准宽度,并根据组件原始布局列数和标准宽度计算出组件标准宽度,进而根据当前屏幕宽度计算出适配后的组件列数,可用如下公式表达:

响应式适配列数(标准屏幕宽度下组件列数) = (当前屏幕宽度÷(标准屏幕宽度÷标准屏幕宽度下组件列数×scale))

其中,scale为组件放大参数,标准屏幕宽度下组件原宽度投放到iPad上会过小,可以通过scale参数进行适当放大。

image.png

对于组件宽度适配,响应式规则会先计算标准屏幕宽度下的组件列数并进行列数适配,再通过适配后的列数计算适配宽度:

响应式适配宽度(标准屏幕宽度下组件宽度) = (当前屏幕宽度 - 边距间距)÷响应式适配列数(标准屏幕宽度÷标准屏幕宽度下组件宽度)

image.png

在以上公式中调整标准屏幕宽度及组件放大scale即可得到适配效果较好的通用布局规则,经过设计同学在各种设备尺寸下的调整总结,当前优酷中使用的标准屏幕宽度为440dp,scale为1.2倍,适配效果最佳。组件适配逻辑已在响应式SDK布局规则中统一实现,业务方直接调用即可,也方便设计同学对整个App的组件适配进行统一调整。

响应式SDK中YKRLCompLayoutManager类封装了相关布局逻辑,业务方也可通过YKRLCompLayoutAdapterProtocol协议二次处理,以定制响应式布局逻辑,在App统一架构中直接调用YKRLCompLayoutManager的相关接口即可获取按照响应式规则计算后的布局参数,如列数、宽度等,当监听响应式状态发生变化时重新布局即可完成响应式布局。

image.png

响应式数据处理
响应式数据处理包括数据映射、数据过滤、数据合并、数据补齐,数据处理逻辑两端一致,详细介绍可以参见:一个APP如何适配多个Android终端?,下面简单介绍一下iOS响应式数据映射的实现。

有些组件无法通过规则适配不同的屏幕尺寸,比如在手机上占整个屏幕宽度的组件(下图左侧带视频播放预约组件),如果采用等比放大的适配规则,在iPad端会显得过大,此类组件可以映射成相对简单的组件,以适配不同的屏幕尺寸。

image.png

优酷采用了统一抽象的数据结构,在组件映射方面比较容易实现,只需修改对应的组件标志即可。得益于统一架构的普遍推广和使用,我们在统一架构内添加了组件映射能力,方便各业务方调用,响应式SDK中提供了数据裁剪映射规则,业务方可以查询、增加相应的裁剪映射规则。对于未接入统一架构的业务方则需要业务方实现相关数据处理。

3 响应式业务流程

优酷响应式业务流程两端一致,响应式布局需要进行数据处理、响应式状态管理、触发布局等工作,优酷响应式SDK会在接口返回后处理相关数据,为统一架构提供相应布局接口,监控屏幕尺寸变化并触发布局等。

image.png

4 优酷响应式方案落地

iOS开发中经常采用绝对布局,而实现响应式的主要工作是将“绝对布局”修改为“相对布局”,接入工作较安卓更为繁琐。

image.png

iOS响应式可以按Window->ViewController->容器->组件的层级完成接入。

Window在配置支持分屏后会由系统自动布局,在RootViewController树中的子ViewController也会随Window自动布局,而特殊ViewController,如多tab页面的子ViewController等,未加入RootViewController树,需要手动修改为相对布局,页面可通过Autoresizing或监听响应式状态实现相对布局。

image.png

接入统一架构的页面容器由统一架构提供,统一架构容器的布局列数管理、布局宽度管理等都已接入响应式SDK,为业务方接入减少了大量工作,业务方只需指定自身所采用的布局规则即可,ViewController和容器实现相对布局后,每当屏幕尺寸变化时响应式SDK会通知容器重新布局,变换组件列数或宽度等,组件卡片只需要按容器提供的尺寸进行布局即可。

组件卡片内一般使用Frame绝对布局,需要修改为相对布局,简单的布局逻辑可以使用Autoresizing实现,方便快捷,复杂的布局可以使用AutoLayout或Masonry等自动布局框架(性能较差)实现,也可以在layoutSubviews方法中重新计算布局,业务方可以选择合适的方式实现自动布局,以减少接入成本。

对于未接入统一架构的页面则需要在本页面布局逻辑中手动接入响应式SDK相关布局接口。

image.png

落地过程中发现许多组件卡片布局时依赖了屏幕宽度,不符合响应式开发规范,导致适配响应式时工作量较大。每一层View只应依赖父层View布局,各层View实现相对布局后,每当屏幕尺寸改变时各层View会自动适配,同时容器的组件列数和尺寸会按响应式规则进行适配,一套代码即可适配所有屏幕尺寸,实现响应式布局。

三 优酷响应式成果

目前优酷全端已具备响应式布局的能力,八月份已上线universal版本,一套代码支持iPhone、iPad竖屏、iPad横屏、浮窗、各种比例分屏,为用户提供了更好更丰富的用户体验。

image.png

image.png

四 总结

响应式能力是多端投放能力的第一步,优酷实现响应式布局后对开发、设计和产品都提出了更高的要求,同时鉴于iPad低端设备占比较高,业务开发过程中不仅要考虑通投能力,更要求App始终保持更高的性能和稳定性,这是我们持续在努力的。

苹果2020年底将推出基于ARM架构的MacBook,也有媒体曝光,苹果正在申请折叠屏相关的专利,相信未来苹果设备的尺寸会越来越丰富,App适配提效是绕不开的话题,而优酷响应式的开发极大扩展了iPhone版App的适用场景,是解决多种设备支持的更好途径,为适应未来更复杂的设备场景打下坚实基础。

 

 

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1024,阿里云惊喜 “加油包” 让你 “猿” 力觉醒!

1024程序员节是广大程序员共同的节日&#xff0c;程序员就像是一个个1024以最核心、踏实、低调的功能模块&#xff0c;搭建起科技世界。 现如今&#xff0c;技术更新迭代越来越快&#xff0c;人类生活愈发便捷化、智能化。这背后自然离不开一批批程序员的默默耕耘与辛苦付出。…

​赠书 | 云游戏搭上 5G 快车,华为、腾讯争相布局

作者 | 林瑞杰 冯林 温向东 陈乐 等来源 | 大数据DT头图 | 下载于ICphoto伴随 5G 网络的部署和商用进程&#xff0c;云游戏作为 5G 技术在消费互联网领域的重要应用&#xff0c;受到了资本和社会的广泛关注。本文介绍了云游戏的基本概念和定义、云游戏的典型特征和分类、云游戏…

数据湖有新解!Apache Hudi 与 Apache Flink 集成

简介&#xff1a; 纵观大数据领域成熟、活跃、有生命力的框架&#xff0c;无一不是设计优雅&#xff0c;能与其他框架相互融合&#xff0c;彼此借力&#xff0c;各专所长。 作者&#xff1a;王祥虎&#xff08;Apache Hudi 社区&#xff09; Apache Hudi 是由 Uber 开发并开源…

显微镜下的大明内容_平凡故事展现炮火下人性光辉,李少红《解放·终局营救》创作全解...

【巨匠】至心至情&#xff0c;匠心独运尝试过大量的题材与类型后&#xff0c;在建国70周年的历史性时刻&#xff0c;李少红老师终于执导了自己的第一部战争电影《解放终局营救》。 有人说&#xff0c;这只是李少红题材创新的一个新方向&#xff1b;有人说&#xff0c;李少红是想…

MQTT在游戏运营发行中的实践

前言 在游戏生态中&#xff0c;主要包含游戏的研发方以及运营发行方。一款游戏的运行&#xff0c;分为研发和运营两个阶段。研发的主体有个人、独立工作室、游戏研发公司等&#xff1b; 游戏的研发主体专注于游戏内容的研发&#xff0c;对游戏的发行及运营往往在人力、财力上…

2021 火爆技术人朋友圈的实时音视频 RTC 你 Pick 了嘛?

5月27日20点&#xff0c;第 13 期「大咖来了」&#xff01; CSDN 副总裁于邦旭、融云 CTO 任杰、即构科技副总裁刘莉&#xff0c;多方视角探讨 RTC 超级风口与机遇&#xff0c;还有众多精美礼品等你拿&#xff01; 立即戳&#xff1a;https://live.csdn.net/room/csdnnews/cn…

SAE 的极致应用部署效率

简介&#xff1a; SAE 在应用创建、部署、重启过程中的效率优化。 作者 | 文俊 阿里巴巴云原生团队 本文整理自《Serverless 技术公开课》 作为 Serverless 平台&#xff0c;SAE 提供了应用全托管的服务&#xff0c;充分利用了云原生的技术红利&#xff0c;以容器作为应用载体…

独家下载!《Java工程师成神之路(基础篇)》

简介&#xff1a; 初学Java的你还在烦恼不知道怎么去学&#xff0c;学习什么内容吗&#xff1f;那么多的技术书籍是否已经让你无从下手&#xff1f;别急&#xff0c;来看这一份完整的Java学习路径。 复制该链接到浏览器完成下载或分享&#xff1a;https://developer.aliyun.com…

Gartner:2021全球安全和风险支出将超1500亿美元

编辑 | 宋 慧 作者 | Gartner投稿 头图 | 付费下载于东方IC 全球信息技术研究和顾问公司Gartner预测&#xff0c;2021年全球信息安全和风险管理技术与服务支出预计将增长12.4%&#xff0c;达到1504亿美元。2020年安全和风险管理支出增长率为6.4%。 Gartner分析师认为&#xf…

四年,如何从前端小白蜕变为前端技术专家?

作者简介&#xff1a;珑晴——淘系技术部前端技术专家&#xff0c;16 年校招实习转正进入的阿里&#xff0c;当时是在聚划算前端团队&#xff0c;随着业务变化一路从聚划算到天猫至今加入淘系技术部&#xff0c;负责日常活动营销的同时&#xff0c;也多次参与大促会场&互动…

Tomcat 一键启停脚本 linux

文章目录一、脚本开发1. 编写脚本2. 修改脚本3. 赋予权限二、脚本执行2.1. 启动tomact2.2. 查看tomact状态2.3. 停止tomact一、脚本开发 1. 编写脚本 vim start-tomcat.sh添加以下内容&#xff1a; #!/bin/bash# description: Tomcat start/stop/status script#Location of …

从 Storm 迁移到 Flink,美团外卖实时数仓建设实践

简介&#xff1a; 本文主要介绍一种通用的实时数仓构建的方法与实践。实时数仓以端到端低延迟、SQL 标准化、快速响应变化、数据统一为目标。 作者&#xff1a;朱良 本文主要介绍一种通用的实时数仓构建的方法与实践。实时数仓以端到端低延迟、SQL 标准化、快速响应变化、数据…

Arm发布移动端v9体系新架构,CPU、GPU、IP全囊括了!

2021年5月25日晚&#xff0c;Arm发布了针对移动端的Armv9体系新架构&#xff0c;除了公布首款全面计算&#xff08;Total Compute&#xff09;解决方案&#xff0c;Arm还发布了首批基于Armv9 架构的Cortex-A CPU&#xff0c;为消费电子视觉体验而设计的Mali-G GPU系列&#xff…

阿里 双11 同款,流量防卫兵 Sentinel go 源码解读

简介&#xff1a; 本文主要分析阿里巴巴集团开源的流量控制中间件 Sentinel&#xff0c;其原生支持了 Java/Go/C 等多种语言&#xff0c;本文仅仅分析其 Go 语言实现。下文如无特殊说明&#xff0c;sentinel 指代 Sentinel-Go。 作者 | 于雨 apache/dubbo-go 项目负责人 本文…

工业发展 安全护航 2021年工业互联网安全发展峰会成功召开

在数字化创新日益深入的背景下&#xff0c;工业互联网已经成为制造企业构建敏捷、弹性的基础架构的重要转型方向。但与此同时&#xff0c;安全风险与威胁向OT环境渗透&#xff0c;产生了额外的复杂性&#xff0c;对于关键业务与数据带来了严重威胁&#xff0c;构建工业互联网安…

基于 Flink + ClickHouse 打造轻量级点击流实时数仓

作者&#xff1a;LittleMagic Flink 和 ClickHouse 分别是实时计算和&#xff08;近实时&#xff09;OLAP 领域的翘楚&#xff0c;也是近些年非常火爆的开源框架&#xff0c;很多大厂都在将两者结合使用来构建各种用途的实时平台&#xff0c;效果很好。关于两者的优点就不再赘…

Spring boot 2.3优雅下线,距离生产还有多远?

简介&#xff1a; 对于任何一个线上应用&#xff0c;如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题&#xff0c;即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求&#xff0c;这使得无损下线成为应用生命周期中必不可少的一个环节。 前言 在生产…

发布 128 核 Altra Max,自研内核,明年推出 5nm 处理器,“性能怪兽”Ampere 搞大事?

2015 年&#xff0c;在英特尔就职 28 年的总裁 Renee James 辞职&#xff0c;正在大众纷纷猜测她将如何开启下一段旅程时&#xff0c;她有了创业的想法&#xff0c;2017 年带领新团队创立了专注于为云和边缘打造微处理器的 Ampere 公司。 在云原生浪潮下&#xff0c;底层硬件需…

2020亚太内容分发大会 阿里云荣获“边缘计算领航企业”奖

10月21日&#xff0c;第八届亚太内容分发大会在北京隆重召开。凭借在边缘计算领域的先发优势、技术实力与丰富实践&#xff0c;阿里云荣获“边缘计算领航企业”称号。 伴随着中国5G商用进程提速&#xff0c;大带宽、大连接、低时延的应用场景爆发&#xff0c;将催生产业变革&a…

最佳途径 | 容器规模化落地如何四步走?

随着云原生时代的发展&#xff0c;传统 IT 基础设施加速云化&#xff0c;云原生化成为云上的必然趋势。作为云原生代表技术之一&#xff0c;容器技术可帮助企业提升 IT 架构的敏捷性&#xff0c;加速应用创新&#xff0c;帮助企业更加灵活地应对商业发展中的不确定性。疫情期间…