屏幕适配的那些坑

屏幕适配的那些坑

2014-12-15 10:27 来源:汪海的实验室

http://www.cocoachina.com/ios/20141215/10634.html

背景

最近在做 iPhone4 和 iPhone6 及 iPhone6 plus 的适配工作。由于历史原因没有用 AutoLayout ,也由于历史原因老代码的布局全是用数字一个一个写死的。这就给适配带来了莫大的困难。比如下面这段代码:

UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 241, 320, 28)];

...

0这种数字还好说,241就完全让人摸不着头脑,至于320这个改成屏幕宽度倒也就还好,但是28这种神奇数字又是什么呢。这种 代码虽然写起来容易,但是维护困难,可读性极差,尤其是有多个控件布局的时候,依赖关系不明显,如果调整布局需要挨个重新计算并设置值,极难维护。

集大成者莫过于此:

CGRect rect = CGRectMake(12.2+(page-1)*320+42.5*(i%7),((totalRows-1)%3)*55+2,42.5,42.5);

今天早上看到这代码差点就抱着键盘哭了出来。

屏幕适配的分享

下面和大家聊一聊屏幕适配中需要注意的内容。

大前提是:纯粹通过代码设置坐标和大小的布局方案(我觉得还是 xib + autolayout 的组合适配起来更轻松一点)。

合理设计

布局虽说是个体力活,但同时也是个艺术活。之所以称之为设计,是因为同样的设计稿可能有很多种实现方式。UIKit 提供了很多现成可用的控件,如何充分利用这些控件实现自己的布局结果就是一个需要思考的过程了。

举 个简单的例子,一个滑动挂断电话的按钮,你可以通过 UIImageView 实现,添加按下的监听然后跟随手指移动,松手之后再动画回到原地即可。你也可以用 UIScrollView 实现,设置 ContentSize 宽于屏幕,从而控制滑块范围。当然你也可以用 UISlider 实现,只需要设置滑块的图像即可。各有优劣,自行判断。

数据语义

如果我想让宽度为100的按钮位于屏幕三分之一处,我可以设置它的 x 值为 57 轻松完成任务。这样虽然简单,但是过段时间再回来维护代码的时候会对这样的神奇数字不知所措,如果要调整布局更是举步维艰。我觉得比较好的方法是把数据由来列出来,像这样:

float x = kScreenWidth / 3 - btnWidth / 2;

这样看起来就轻松多了:屏幕的三分之一处再往左半个宽度,也就是 x 的值。

相对布局

我们常常遇到很多控件同时出现的情况,比如三个从上往下依次间隔10像素的按钮,可以这样实现:

CGRect rect1 = CGRectMake(0,0,100,44);
CGRect rect2 = CGRectMake(0,54,100,44);
CGRect rect3 = CGRectMake(0,108,100,44);

但是如果我们想把这三个按钮同时下移,那我们就需要挨个设置一遍。比较好的方案是通过相对布局来实现。

CGRect rect1 = CGRectMake(0,0,100,44);
CGRect rect2 = CGRectMake(0,rect1.origin.y+rect1.size.height,100,44);
CGRect rect3 = CGRectMake(0,rect2.origin.y+rect2.size.height,100,44);

当然什么场景使用相对布局,针对哪些控件使用相对布局,这些就是我们需要设计的问题了。

层次关系

一般情况下,一个页面内会出现很多控件,如果都通过 addSubview 添加到视图中很容易混乱。可以通过一些 UIView 作为容器辅助布局。个人觉得可以给控件们安排好深度,同个深度的控件再进行分组,有助于管理。

灵活精准

布 局代码的灵活性十分重要。比如两个和屏幕等宽的按钮,如果通过160设置宽度,现在iPhone6一出之后就纷纷中枪了。再比如那种 CollectionView 的单元格宽度高度写死了44.5的,最好是通过计算动态获取。虽然有一定的计算量,但是在后期如果遇到设计变更什么的,只需要改个宏定义 的 CELLS_PER_ROW 这样的值就可以实现新需求,十分方便。更重要的是,这样的代码往往是有意义的,所有的值和布局结果都是可以语义化表达 的,这样会让整个代码鲜活起来,充满生命力。

时间: 2025-01-06 06:08:57

屏幕适配的那些坑的相关文章

解决多屏幕适配的问题Dimension

开闭原则--可变与不变的分离,且容易定制 应用程序的目的是尽可能做到适用于多种设备,这些设备的配置不尽相同,有些不同的物理尺寸,分辨率.为了达到最佳的适配效果,和最少的代码重复,以及最好的可扩展性,就需要分离资源的使用和资源.用一个统一的资源管理者来管理资源.代码通过资源管理者提供的统一的接口来获取资源.这样对于使用者来讲资源的获取的方式是统一,资源者无需关心如何为不同的设备获取不同的资源.这样就把随不同设备变化而变化的代码降到最低,只有资源管理者需要操心不同的设备相关的不同的资源. 比如:字串

Unity 手机屏幕适配

////如有侵权 请联系我进行删除 email:[email protected] 1.游戏屏幕适配 屏幕适配是为了让我们的项目能够跑在各种电子设备上(手机,平板,电脑) 那么了解是适配之前首先要了解两个知识点: 1-1.什么是像素? 单位面积中构成图像的点的个数. 特点:单位面积内的像素越多,分辨率越高,图像的效果就越好. 1-2.什么是分辨率? 分辨率可以从显示分辨率与图像分辨率两个方向来分类. 示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少.分辨率的单位有:(dp

登录界面、AutoUtils 屏幕适配、自定义Edittext(显示密码可见和一键清空)和 TextInputLayout的使用。

登录界面: AutoUtils自动屏幕适配: AutoUtils屏幕适配使用的方法 : 1.将AutoUtils类复制到要适配的项目中: 2.在程序的入口(清单文件filter):super.onCreate(savedInstanceState);//屏幕适配,这里是以720*1280分辨率为基准的适配AutoUtils.setSize(this, false, 720, 1280); * 这里我们UI是以1920*1280分辨率做图的,并且是横屏显示:AutoUtils.setSize(th

纯代码 自动屏幕适配iPhone

代码判断,你也可以用xib自带的自动布局选项 我是用的纯代码写的 纯代码 自动屏幕适配iPhone,布布扣,bubuko.com

手机卫士13_屏幕适配_异常处理_盈利模式_混淆加密

今天是手机卫士最后一天 1,简易屏幕适配: ①使用线性,相对,帧布局,这三种常用布局在所有设备上几乎可以完整实现,多使用dp,sp,不要使用像素,dp,sp会自动适应屏幕 ②浮动窗体显示的距离问题:它show出来的距离就是像素,所以显示距离不会适应屏幕. 代码里接收的单位一般都是像素. 解决方式:把输入的数字转换成dp单位. 得到像素密度*像素 获得dp数据,根据屏幕实现的像素效果 通过工具类去转换成dp数据DesityUtils 2,应用程序的异常处理: 2.1 alpha版本:小范围的内部测

iOS里面的屏幕适配(两种方法)

第一种方法:进行等比缩放 适用于只有单个或者很少的页面需要适配的时候 第二种方法:用别人已经封装的类,进行屏幕的适配 适用于多个页面都需要进行屏幕适配 这是在ViewController.m里面的代码

屏幕适配的简单介绍

这两天上传了一些代码,有的同学反馈没有自动适配,所以现在总结点有关屏幕适配的知识 1 屏幕适配可以使用frame,但是需要多套代码,非常的麻烦 2 可以使用autoResizing适配:Ios6之前出现的,用来约束父子控件之间的关系,和autolayout是冲突的, 两者不能同时使用,外边的四条线段选中,表示距离四周间距是固定的,里面的两个线段,当勾选上的时候,表示不固定,拉伸.不勾选,表示固定. 3 autolayout:Ios7开始大规模使用,既可以设置父子之间的关系,也可以设置同级之间的关

关于android屏幕适配

好吧 我承认被美工虐的够呛,而且美工他么是个男的!一点也不美, 废话不多说 急着赶路, 之前不怎么重视 直到遇见这个美工给我一套1080x1920的 图,没错 就一套 1dp=3px没错的啊 问题是就是适配不了! 懒吧, 那段时间不得不靠啊 屏幕适配其实很多种, 代码实现 布局实现 关于权重,图片放在不同文件夹下,那么 当你遇见华为系列的手机怎么办? 我当时是这么做的 display获取屏幕宽高 记得不错的话 华为的是 720x1814的... 新建文件夹 layout-1184x720 然后把

[转]再谈移动端Web屏幕适配

一个多月前水了一篇移动web屏幕适配方案,当时噼里啪啦的写了一通,自我感觉甚是良好.不过最近又有一些新的想法,和之前的有一些不同. 先说一下淘宝的方案,感觉现在好多的适配方案都是受了它的影响,上周六看了winter在一个会议的分享,讲到了这个方案.现在你谷歌一下移动web适配,绝对可以看到很多类似的,切活动页的童鞋都忍不住试一把.这些方案和我的博客写的其实还是相似的,就是抛弃了那种viewport直接缩放,然后给定html的初始font-size值,使用rem这个单位. 在屏幕的设备像素比上,也