微信iOS多设备多字体适配方案总结

一、背景

2014下半年,微信iOS版先后适配iPad, iPhone6/6plus。随着这些大屏设备的登场,部分用户觉得微信的字体太小,但也有很多用户不喜欢太大的字体。为了满足不同用户的需求,我们做了全局字体设置功能,在【设置-通用-字体大小】这里修改设置后,微信大部分界面都会随之缩放。

 

二、多设备适配

1、各设备的逻辑分辨率:

关于iphone6/6plus的物理分辨率、逻辑分辨率、屏幕物理尺寸、PPI等资料,很多文章已经有详细说明了,这里就不再累赘。对于终端开发人员来说,其实我们需要关心的,主要是各设备的逻辑分辨率和scaleFactor:

 

需要注意的是,iphone6和6plus可以设置标准模式和放大模式。在放大模式下,6plus会退化为375x667,此时应该当成iphone6来做适配。而iphone6会退化为320x568,应该当作iphone5来适配。

从表中可以看出,适配iphone6/6plus、ipad带来最大的变化是,屏幕宽度不再是320。以往我们可能一直习惯320宽的屏幕,所以写界面的时候容易hardcode,例如,如下图所示,有个按钮离屏幕左右边距分别为20,我们可能会把按钮宽度写死为280:

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(20, 15, 280, 46)];

 

但到了iphone6 plus上,屏幕宽度变成414,按钮的左右边距就变成20和114,显得不对称。在适配时,根据UI需要,此时可能会增加按钮宽度,改成20+374+20;也可能增加左右边距,改成67+280+67;也可能两者都增加,例如改成26+362+26,使得按钮宽度保持屏幕宽度的7/8。

为了实现这些适配需求,我们的解决方案是,使用配置文件,把界面参数从代码中分离开来,便于参数的适配。

 

2. 配置文件介绍

配置文件分为两部分:

第一部分是UI规范配置,把需要统一风格的UI元素定义下来。例如对于链接字体颜色,定义LINK_COLOR = rgba(87,107,149,1),所有界面包含链接时,链接的字体颜色都直接取LINK_COLOR,不单独harcode,这样有利于微信的整体UI风格统一、UI规范化,也方便以后UI调整时对链接字体颜色做统一修改。

// UI规范化
@colors{/* 普通列表(PlainStyle)的背景色 */DEFAULT_TABLE_BACKGROUND_COLOR: #2E3132;/* 链接字体颜色 */LINK_COLOR: rgba(87,107,149,1);
}

第二部分是各界面的配置,可以对颜色、字体、切片、数值、坐标、尺寸、frame等进行配置,并根据设备适配的需求定义了一些扩展属性。

#test_view{/* 数值 */button_margin1: 20;button_margin2: 20 EqualRatio 320;button_margin3: 200 EqualDifference 320;/* frame、尺寸、坐标 */logo_frame: 0 0 200 200; /* frame */logo_size: 200 200; /* size */logo_origin: 0 0; /* origin *//* 颜色相关 */table_bkg_color: DEFAULT_TABLE_BACKGROUND_COLOR;button_bkg_color1: #00C000;button_bkg_color2: rbga(255,255,255,0.8);button_bkg_color3: clear;logo_image: “btn_bkg.png” 40 40; /* 切片 */label_font: 16 bold; /* 字体 */
}

下面对其中一些配置加以说明:

button_margin2: 20 EqualRatio 320;

表示在不同设备下做等比缩放,在320宽的屏幕下是20,在iphone6 plus屏幕上就是20 / 320 * 414=26

button_margin3: 20 EqualDifference 320;

表示在不同设备下做等差缩放,在320宽的屏幕下是200,在iphone6 plus屏幕上就是200 + (414-320) = 294

 

table_bkg_color: DEFAULT_TABLE_BACKGROUND_COLOR;

这里使用了UI规范配置里面的定义值

logo_image: “btn_bkg.png” 40 40;

指定了切片的文件,并指定其尺寸(不指定则默认按切片本身的尺寸)。

label_font: 16 bold;

指定字体大小,并为粗体。

 

EqualRatio,EqualDifference这两个关键词使界面的配置能够尽量做到一个设计稿适配多种设备。但有时候,我们需要在分设备进行单独配置,而等差和等比原则又无法满足。为了解决这个问题,每种设备单独一个配置文件,目前一共五种设备:默认(iphone5)、iphone4/4s、iphone6、iphone6plus、ipad。读取配置文件时,先读默认配置(iphone5),然后根据当前机型再读取单独的配置(如果是ipad就读ipad的配置,如果是iphone5就不用再读了)。这样取值时会优先取到单独的配置,如果没有单独配置就取到默认配置。

例如,默认配置中定义:

button_margin1: 20;
button_margin2: 20 EqualRatio 320;
button_margin3: 20;

iphone6plus的配置中定义

button_margin1: 30;

则在iphone6plus中,取到的值分别为button_margin1为30(取6plus配置的值),button_margin2为26(取默认配置的等比原则),button_margin3为20(取默认配置的值)

 

三、界面放大

全局字体设置不是简单地修改所有字体的大小,以主界面的会话cell为例,如下图a所示,如果所有字体改大,界面会变成图b所示,很不协调,两个label的上下间距也显得太小,甚至当字体再改大时会出现重叠问题。

为了保证两个label有足够的上下边距,cell的高度需要随之增加,如图c所示。这样会导致左侧头像在cell中显得太小,于是头像的宽高也要随之放大,头像上的红点也要跟着放大,……,最终整个界面很多元素(字体、宽高、边距等)都需要放大。

图a


图b

图c

图d

至于各元素要放大多少,一开始是想只推出一个大字体版本,由设计师出一套方案。但仔细想想工作量太大了,所有界面都要再出一套设计稿,而且不够灵活,不同设备上的大字体版都只能按照这套设计稿来。最后我们决定用等比放大的原则,所有元素按照统一一个比例进行放大,这样出来的效果还不错,重要的是大大减少了设计和开发的工作量。具体操作是:每个机型设五档字体,设计师确定各机型上每档字体的放大比例,开发写界面时,把字号大小、宽高、边距等值写到配置文件里,并指定这些值是否要随字体设置等比缩放。

在配置文件中,我们增加了关键词dynamic,使得界面能够支持根据字体设置缩放。例如:

    button_height: 42 dynamic;

表示在不同字体大小设置下,动态缩放。标准字体下高度是42,字体放大50%后高度就是63

    logo_image: “btn_bkg.png” 40 40 dynamic;

指定了切片的文件,并指定其尺寸(不指定则默认按切片本身的尺寸),并且在不同字体大小设置下,动态缩放。

    label_font: 16 bold dynamic;

指定字体大小,并为粗体,同样根据字体设置动态放大。

 

需要注意的是,在对界面参数等比放大时,放大后的长度值要向上取整。这是因为UIView setFrame传入的CGRect,如果坐标或宽高值为小数,可能导致文字出现模糊(不锐利)、view出现黑边等现象。

 

四、webview字体放大

iOS上,可以在webview页面load完后,设置页面body的style.webkitTextSizeAdjust属性,对页面进行放大。例如:

document.getElementsByTagName("body")[0].style.webkitTextSizeAdjust=“150%”;

这种方法实现简单,但有两个问题:

1、对于复杂的图文页面,放大后的页面很难看。例如腾讯新闻页面的底部,放大后如下图所示。这是因为字体放大了,但图片、宽高等其它元素没有放大。

2、由于要等页面load完才能重写webkitTextSizeAdjust属性,导致页面load完后还会再刷新一下。

幸好微信里的webview阅读90%都是公众号文章,这些页面样式相对统一,而且是微信团队可控的。针对公众号文章,我们做了以下优化:

1、把用户的字体设置作为参数传给公众号平台,由他们调整页面样式后再出页面,这样load出来的页面style就是已经放大的了,不需要客户端重写style导致页面刷新一次。

<html style="-webkit-text-size-adjust: 160%;line-height:1”>

2、如果用户手动修改webview的字体大小,客户端会触发一个jsapi,公众号页面监听并实现这个jsapi,对页面样式进行调整。这样把字体修改的实现方法交给页面本身,而不是简单用webkitTextSizeAdjust,可以达到更好的放大效果。

WeixinJSBridge.on(‘menu:setfont’,function(res){// use fontScale, then set -webkit-text-size-adjust and line-height
});

 

对于非公众号文章,目前默认不随全局字体设置做放大,如果用户手动修改webview的字体大小,会用webkitTextSizeAdjust修改。后续可以把这个jsapi推广到腾讯新闻插件,甚至开放出去,尽量把字体修改的实现方式交给页面。

 

 

五、iOS9 iPad分屏多任务

WWDC2015上推出了iPad分屏多任务功能,使得iOS设备的逻辑分辨率又多了五种:


分屏类型分辨率
竖屏-小屏320*1024
竖屏-大屏438*1024
横屏-小屏320*768
横屏-半屏507*768
横屏-大屏694*768

使用目前的适配方案,能够很快地适配iPad分屏。具体方法是:
1、对于320*768和320*1024的屏幕大小,用iphone5的配置参数;
2、对于其它屏幕大小,使用ipad的配置参数,并对必要的参数根据屏幕大小指定等差/等比缩放。

 

六、总结

界面参数写在配置文件有几个好处:

1、能够很快适配不同机型:对必要的参数指定等差缩放或等比缩放,就可以做到一个设计稿适配多种设备。

2、方便对不同机型做特殊处理:有时候个别参数在不同设备上有差异,而等差/等比原则又无法满足需求。如果参数写在代码里面,就有一堆机型的if判断:

if (isIpad) …;
else if (isIphone6) …;
else …

而写在配置文件里,只需要根据不同机型读相应配置文件即可。

3、能够很快适配不同字体大小:配置文件里指定哪些参数需要等比缩放,哪些是固定值,读参数的时候做一下处理,就可以实现界面缩放,不需要修改代码。

4、方便界面参数调整:设计师做界面微调时,可以自己修改配置文件,快速确认效果,不需要先跟开发沟通,等开发修改完代码后再确认。一方面减少了沟通成本,另一方面也减轻了开发的负担。

转载于:https://www.cnblogs.com/yulang314/p/5077270.html

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

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

相关文章

python点线图_Python | 点线图

python点线图A mixture of dot and line plot is called a Dot-Line plot. Each dot is connected through a line and it is the next version of the line plot. It maintains the discrete property of the points and also represents the correlation between consecutive…

Android Studio导入工程的正确姿势

为什么80%的码农都做不了架构师&#xff1f;>>> 如果你有很好的网络环境 好的网络环境&#xff0c;这里不是指&#xff1a;我家网速带宽100M&#xff0c;电信的光纤接入。 而是&#xff1a;能翻墙。因为如果本机的gradle和将要导入的工程版本不匹配&#xff0c;Stu…

为什么年轻人挣得很多还是穷?北上广深挑战指数报告~

又是年底&#xff0c;又到了做选择的时候。从“激情燃烧的岁月”到“何处安放的青春”&#xff0c;逃离北上广深的口号从未停止过&#xff0c;回到北上广深的呼喊更是一浪接着一浪。应届生们奔波忙碌&#xff0c;想有一份承载自己梦想的工作&#xff0c;想在异乡有一处安身之所…

apple组织名称是什么_什么是Apple Macintosh?

apple组织名称是什么苹果Macintosh (Apple Macintosh) Steve Jobs and Steve Wozniak has founded the line of computers in the year 1984, on the date 24th January, named it Apple Macintosh. Macintosh is shortly abbreviated as Mac. In this, various versions of co…

CentOS 创建SVN 服务器,并且自动同步到WEB 目录

CentOS 创建SVN 服务器&#xff0c;并且自动同步到WEB 目录 标签&#xff1a; centossvnsubversion服务器2013-12-06 10:09 5492人阅读 评论(0) 收藏 举报分类&#xff1a;linux&#xff08;5&#xff09; 一、安装Subversion #yum install subversion二&#xff0c;基本的SVN服…

TTYL的完整形式是什么?

TTYL&#xff1a;稍后再与您交谈 (TTYL: Talk To You Later) TTYL is an abbreviation of Talk To You Later. It is an internet slang that is most generally used in text messaging, instant messaging, and chatting on Facebook, Twitter, WhatsApp, etc. The acronym i…

zhilizhili-ui 2016始动 开始做个样例站吧 (一)

对 我又挖坑了 不过其实也不算挖坑 因为ui构建中就会有填坑的文章 之前一直在写《编写大型web页面 结合现有前端形势思考未来前端》这是一篇巨难写的文章 估计要到年中才能写好了 写作的过程中 发生了国内前端大撕逼 2015的尾声大战 是否可以宣告前端是否开始新的时代 2016年 国…

python 网格_Python | 网格到情节

python 网格Most of the time, we need good accuracy in data visualization and a normal plot can be ambiguous. So, it is better to use a grid that allows us to locate the approximate value near the points in the plot. It helps in reducing the ambiguity and t…

slr1文法_SLR的完整形式是什么?

slr1文法单反&#xff1a;单镜头反光 (SLR: Single Lens Reflex) SLR is an abbreviation of Single Lens Reflex. It is used in high standard cameras. SLR makes use of an automatic moving mirror arrangement that makes it possible for photographers to perceive pre…

vim快捷键2

一、移动光标 1、左移h、右移l、下移j、上移k 2、向下翻页ctrl f&#xff0c;向上翻页ctrl b 3、向下翻半页ctrl d&#xff0c;向上翻半页ctrl u 4、移动到行尾$&#xff0c;移动到行首0&#xff08;数字&#xff09;&#xff0c;移动到行首第一个字符处^ 5、移动光标到下一…

什么是苹果耳塞?

苹果耳塞 (Apple Earbuds) Apple Earbuds are another sound device made by Apple on 23rd October 2001. It is an in-ear sound device and it has been included in all the mobile and music devices of Apple. Apple Earbuds are quite comfortable and easy to handle w…

趣说游戏AI开发:对状态机的褒扬和批判

0x00 前言 因为临近年关工作繁忙&#xff0c;已经有一段时间没有更新博客了。到了元旦终于有时间来写点东西&#xff0c;既是积累也是分享。如题目所示&#xff0c;本文要来聊一聊在游戏开发中经常会涉及到的话题——游戏AI。设计游戏AI的目标之一是要找到一种便于使用并容易拓…

sencha touch调试时Please close other application using ADB: Monitor, DDMS, Eclipse

1、运行——cmd—— netstat -aon|findstr "5037" 2、打开任务管理器&#xff0c;查看所有进程 显示进程pid&#xff08;文件-查看&#xff09;--查找pid7740的结束。转载于:https://www.cnblogs.com/taoshengyujiu/p/5099588.html

l和l_L&T的完整形式是什么?

l和&lL&#xff06;T&#xff1a;Larsen和Toubro (L&T: Larsen and Toubro) L&T is an abbreviation of Larsen and Toubro. It is an Indian multinational conglomerate corporation with international networks and operations. It is dynamically engaged in …

CRT的完整形式是什么?

CRT&#xff1a;阴极射线管 (CRT: Cathode Ray Tube) CRT is an abbreviation of Cathode Ray Tube. Cathode Ray Tube is a vacuum tube that accommodates one or more than one electron filled guns and a phosphorescent screen, which is used in television and convent…

推送证书

2019独角兽企业重金招聘Python工程师标准>>> 推送证书 1 openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes 转换文件上传 2证书有效期 openssl x509 -in xxx.pem -noout -dates —反馈 notBeforeDec 12 07:42:27 2015 GMT notAfterDec 11…

Dubbo学习总结(4)——Dubbo基于Zookeeper实现分布式实例

入门实例解析 第一&#xff1a;provider-提供服务和相应的接口 创建DemoService接口 [java] view plaincopyprint? <span style"font-size:18px;">package com.unj.dubbotest.provider; import java.util.List; /** * 定义服务接口&#xff0c;该…

[转载]PhotoShop性能优化

现在随着Photoshop版本越来越高功能也越来越强大&#xff0c;而往往强大的功能需要电脑有好的配置运行&#xff0c;比如HDR、图像合成或者3D和视频等类似的功能&#xff0c;还有处理比较大尺寸的图像时&#xff0c;如果电脑配置不够强往往非常卡&#xff0c;这时我们就要好好设…

0.1uf与47uf并联_UF是什么形式?

0.1uf与47uf并联UF&#xff1a;超滤 (UF: Ultrafiltration) UF is an abbreviation of Ultrafiltration. It is a kind of membrane filtration which is used in UF water purifiers. Through a hollow fiber threaded semi-permeable membrane, the water is made to proceed…

机器学习相关——协同过滤

在现今的推荐技术和算法中&#xff0c;最被大家广泛认可和采用的就是基于协同过滤的推荐方法。本文将带你深入了解协同过滤的秘密。下面直接进入正题 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF)&#x…