iPhone多尺寸屏幕适配--等比例数值计算

    作为一个iOS开放者,在iPhone6和iPhone6 plus发布之后,慢慢的都会遇到屏幕适配的问题。
    在讨论适配之前,我们先来看看系统提供的放大模式。
放大模式下:屏幕尺寸仍然为320宽度,会根据设备,界面等比放大至其他屏幕宽度的尺寸,由于是放大,会导致界面有轻微的模糊,并且状态栏也会和平时不一样(明显变大了)。

    那么适配模式下呢?不同尺寸设备的屏幕点像素是不一样的,如果要处理一个界面,并且要求iPhone6plus和iPhone5S是同一套设计稿,看起来一样比例。那么怎么破?


    无论是使用传统布局,还是使用AutoLayout,都避不开的是界面的数值计算,比如同一个左边距,在iPhone5下是10px,但是等比换算到iPhone6plus的时候差不多就是13px了,莫非为了不同屏幕看起来比例一样,我们还要分开处理,用条件来判断并分别布局么?

    当我开始这么想的时候,我是拒绝的,因为我们是爱加特效的开发者,怎么能连等比例计算都不会玩呢?

    好了拿到iPhone5s屏幕尺寸640*1136的设计稿,什么?左边距是20px?

CGFloat leftPadding = 10*SCREEN_WIDTH/320.0;

    LOOK! 我们已经有了一个可以在各个尺寸屏幕下按同一个设计稿等比例适应的左边距了! 恩恩,还有很多值,一个个来…

CGFloat rightPadding = 15*SCREEN_WIDTH/320.0;
CGFloat topPadding = 20*SCREEN_WIDTH/320.0;
.....

    等等,这么算,貌似有很多重复的东西出现了:SCREEN_WIDTH/320.0,作为一个有追求的开发者,怎么能忍受那么多重复的计算。必须加特效!

    这里我为了便捷,使用类似CGRect之类C函数实现,考虑性能没有使用inline。建立一个空的UIView的category
.h头文件中:

extern CGFloat CGFloatIn320(CGFloat value);

.m实现文件中:

static CGFloat ratio = 0;//这是为了只算一次不要浪费太多计算比例的性能
CGFloat CGFloatIn320(CGFloat value){
    if (ratio==0) {
        ratio = ([UIScreen mainScreen].bounds.size.width
        >[UIScreen mainScreen].bounds.size.height
        ?[UIScreen mainScreen].bounds.size.height
        :[UIScreen mainScreen].bounds.size.width)/320.0;
    }
    return value*ratio;
}

好了,现在再来计算我们的边距:

CGFloat leftPadding = CGFloatIn320(10);
CGFloat rightPadding = CGFloatIn320(15);
CGFloat topPadding = CGFloatIn320(20);
.....

    这样看起来真的是蛮不错啊,相信许多开发小伙伴也在用类似这样的方式做布局,总体上来说,这是要求不同尺寸相同比例布局的一个可行的方案,但是还是要多说两句:这种方式下的计算有时候会存在很小很小的偏差,虽然不多,但是有时候也会影响效果,所以,必要时的等分计算、自动布局的使用都是提高界面精确程度的方式。

    当然,这么简单的文章相信大家都能看得懂。最后贴上一篇别人家的文章,希望大家都能做好适配处理:
iPhone 6出现后,如何将一份设计稿支持多个尺寸?

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
最近帮工作室改一个项目,需求是制作许多单选、多选的Dialog弹出框,我感觉有许多代码都是可重用的,就写了个可重用的Dialog类,废话不多说,先看图: 由于一些和谐的原因,实际效果肯定是比这个好看的,这里基本上都是原生属性修改……简单讲一下设计思路吧: 为什么选择自定义DIalog子类而不是AlertDialog子类(或者其他)? Dialog子类是诸如AlertDialog子类等的父类,其可自定义范围更广(因为被设计的子类属性、方法等更少,同时又具备必要的属性和方法),其次就是,有些子类的设计就让人非
1.首先我们先来使用Meta工具查看IMEI保存的位置 我们打开meta工具,找到NVRAM_EF_IMEI_IMEISV_LID,如图: 2.我们打开meta工具找到System related LID,找到NVRAM_EF_SYS_CACHE_OCTET_LID下第十个字节,如图:(这里我们需注意的是IMEI SVN并不是和IMEI保存在一起,而是分开存放在NVRAM_EF_SYS_CACHE_OCTET_LID下面)

iOS 支付宝支付繁忙ALI59 - 2015-04-08 09:04:04

在iOS 调用支付宝支付时出现此提示。 主要情况为 tradeNO   amount等参数中  有特殊字符 导致, 在此处打个断点 po 一下相应的参数就好了。 在此也收集下调用支付宝支付出现的问题。 欢迎留言。

2048小游戏源码 - 2015-04-08 06:04:17

2048小游戏 下载地址: http://www.devstore.cn/code/info/737.html 运行截图:    
昨天被问到一个问题MonoBehaviour的Awake()和Start()的区别是啥? 当然Awake()会在Start()之前被调用,这个地球人都知道了。如果只是顺序问题,那当然就没太大必要搞两个函数了。仔细研究了一下API文档: Awake():Awake is called when the script instance is being loaded. Start():Start is called on the frame when a script is enabled just befo

[置顶] Android-Service组件 - 2015-04-08 06:04:16

Service是一个android的四大组件之一,它没有UI界面,可以在后台执行长时间的操作。其他的组件可以start一个Service,service启动以后会在后台持续运行,不管用户是否切换到了其他的应用程序。此外,其他的组件还可以绑定到service上,并和service做交互,甚至还可以执行跨进程的操作(IPC)。比如说,Service可以在后台处理网络请求、播放音乐,执行文件i/o或者跟content provider交互。 有两种形式的service: Started 当其他的组件通过调用st

51单片机内部资源 - 2015-04-08 06:04:16

       通过这篇博客对这一段时间对51单片机的学习做一定总结,这是对单片机内部资源的一定总结:单片机的内部资源总体上分为两部分:基本功能和服务性功能。如下图所示; 对于基本的器件有:LED灯,蜂鸣器、继电器、步进电机和按键。其中通过LED的不同组合方式可以扩展出LED流水灯、数码管和点阵。其实基本的器件的工作方式是基本相同的,只是对电平表现出的不同输出方式。其中数码管可以通过动态和静态两种方式显示;静态显示为一对一形式,动态显示为一对多形式的循环显示。其中点阵的表现方式其实和数码管的动态显示是相同的

[置顶] 对准了射 - 2015-04-08 06:04:11

    小弟新游戏《对准了射》苹果商店上线,各位朋友都来支持一下,谢谢! 苹果手机下载地址:   https://itunes.apple.com/cn/app/dui-zhun-le-she/id960171989?mt=8       这是一款物理小游戏,欢迎大家下载试玩给本人提供意见和建议,谢谢
注:本文改编自 Android_Tutor 的文章,原文地址: http://blog.csdn.net/android_tutor/article/details/5740845 Android中的传递有两个方法,一个是Serializable,另一个是Parcelable。 Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable
估计很多码友都遇到过这样的情况: UIButton在某些情况下不能立刻响应TouchDown事件,换句话说, 迅速点击 按钮时,你是永远看不见这个按钮的高亮状态的。 而你会发现,出现这种情况时,这些按钮都在UIScrollView(UITableView)上。 为此我用了一下午时间查贴整理,得到了完美的解决方案。 在介绍解决方案前,必须先科普一些事实,帮助大家理解: UIScrollView: 1、属性 delaysContentTouches ,布尔类型,默认值为YES。值为YES时,UIScrollV