StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程

声明:本文章是为了后期快速兼容6和6Plus的按比例放大方法,对于部分读者来说可能觉得该方法不妥。但是对于复杂的界面还有急于交付项目的人来说还是有一定帮助的。

现在由于苹果公司出了6和6Plus,让写苹果程序的哥们为了做兼容很头疼。用StoryBoard固然方便,但是后期做兼容要花费太多的时间和精力。
使用AutoLayout虽然会在不同尺寸的屏幕下自动布局,但是很多东西还是要自己手动修改,而且使用AutoLayout的话有一个弊病,就是无法通过代码来修改StoryBoard上控件的尺寸和位置。
使用纯代码搭建界面又会觉得不够直观,要花时间调整布局,虽然方便后期做调整兼容性,但是影响开发效率。
当然个人觉得还是代码和StoryBoard结合的方式比较方便。
先说下使用本方法的要求,首先iPhone5的界面一定要完全兼容,这样才能完美兼容6和6Plus。
首先,我么我们要观察一下5,6和6Plus的尺寸比例关系。发现了他们的关系后呆会做兼容就明白了。

很明显能看出这三种屏幕的尺寸宽高比是差不多的,因此可以在5的基础上,按比例放大来兼容6和6Plus的屏幕。
在AppDelegate.h中


1

2

@property float autoSizeScaleX;

@property float autoSizeScaleY;

在AppDelegate.m中


1

2

3

4

5

6

7

8

9

10

11

12

13

14

#define ScreenHeight [[UIScreen mainScreen] bounds].size.height//获取屏幕高度,兼容性测试

#define ScreenWidth [[UIScreen mainScreen] bounds].size.width//获取屏幕宽度,兼容性测试

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];

    if(ScreenHeight > 480){

        myDelegate.autoSizeScaleX = ScreenWidth/320;

        myDelegate.autoSizeScaleY = ScreenHeight/568;

    }else{

        myDelegate.autoSizeScaleX = 1.0;

        myDelegate.autoSizeScaleY = 1.0;

    }

}

因为iPhone4s屏幕的高度是480,因此当屏幕尺寸大于iPhone4时,autoSizeScaleX和autoSizeScaleY即为当前屏幕和iPhone5尺寸的宽高比。比如,
如果是5,autoSizeScaleX=1,autoSizeScaleY=1;
如果是6,autoSizeScaleX=1.171875,autoSizeScaleY=1.17429577;
如果是6Plus,autoSizeScaleX=1.29375,autoSizeScaleY=1.2957;
现在我们获取了比例关系后,先来看一下如何解决代码设置界面时的兼容。
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)这个方法使我们常用的设置尺寸的方法,现在我设置了一个类似于这样的方法。
在.m文件中


1

2

3

4

5

6

7

8

9

10

11

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake1(100, 100, 50, 50)];

CG_INLINE CGRect//注意:这里的代码要放在.m文件最下面的位置

CGRectMake1(CGFloat x, CGFloat y, CGFloat width, CGFloat height)

{

    AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];

    CGRect rect;

    rect.origin.x = x * myDelegate.autoSizeScaleX; rect.origin.y = y * myDelegate.autoSizeScaleY;

    rect.size.width = width * myDelegate.autoSizeScaleX; rect.size.height = height * myDelegate.autoSizeScaleY;

    return rect;

}

这样,这个btn按钮在5,6和6Plus的位置和尺寸比例都是一样的。
代码兼容完之后,来看一下StoryBoard的兼容,当然,在平时的项目中我们不可能就一两个视图,而且每个视图里面可定还套有很多其他视图,如果把所有视图的尺寸用手动输入CGRectMake的方法来改兼容的话工作量非常大,而且容易出错。经过多次试验,我想出一种能快速兼容大多数界面的方法

在AppDelegate.h中


1

2

//兼容函数

+ (void)storyBoradAutoLay:(UIView *)allView;

在AppDelegate.m中


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//storyBoard view自动适配

+ (void)storyBoradAutoLay:(UIView *)allView

{

    for (UIView *temp in allView.subviews) {

        temp.frame = CGRectMake1(temp.frame.origin.x, temp.frame.origin.y, temp.frame.size.width, temp.frame.size.height);

        for (UIView *temp1 in temp.subviews) {

            temp1.frame = CGRectMake1(temp1.frame.origin.x, temp1.frame.origin.y, temp1.frame.size.width, temp1.frame.size.height);

        }

    }

}

//修改CGRectMake

CG_INLINE CGRect

CGRectMake1(CGFloat x, CGFloat y, CGFloat width, CGFloat height)

{

    AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];

    CGRect rect;

    rect.origin.x = x * myDelegate.autoSizeScaleX; rect.origin.y = y * myDelegate.autoSizeScaleY;

    rect.size.width = width * myDelegate.autoSizeScaleX; rect.size.height = height * myDelegate.autoSizeScaleY;

    return rect;

}

storyBoradAutoLay是把当前view进行两层遍历,把里面的UIView类型的控件的尺寸取出来,乘以对应的比例再赋值给它的尺寸,这样StoryBoard里的兼容就完成了。如果你的界面里嵌套的比较多的话可以多加几层遍历。

在继承了UIViewController的.m文件中


1

2

3

4

5

#import "AppDelegate.h"

- (void)viewDidLoad{

    [super viewDidLoad];

    [AppDelegate storyBoradAutoLay:self.view];

}

在所有的继承了UIViewController的文件中,都加上storyBoradAutoLay这句代码,就能把当前的view进行兼容。
现在我们来看一下使用了该方法兼容的前后对比效果吧。

iPhone6兼容前

iPhone6兼容后

iPhone6Plus兼容前

iPhone6Plus兼容后

如果整个项目做完后才开始做兼容的话这个方法的优势就体现出来了,面对几十个工程文件,只需自定义并且替换你的CGRectMake方法,再加上storyBoradAutoLay这个方法就瞬间完成大部分甚至全部的兼容。
其实还是比较建议用代码和StoryBoard结合的方式来写代码,无论是从做兼容还是效率来说都是比较好的。
如果遇到tableView的或者其他的兼容改动,手动调整一下即可。如果真的有在兼容的其他方面的遇到问题的,也可以直接与我交流讨论。或者给我留言也可以。如果觉得我的兼容的方法有问题也可提出~

对于本文所采用的方法,请注意以下条例
0:本文原网址为:http://blogs.zmit.cn/5121.html
1:本方法不具权威性,只是个人平时的工作总结。觉得有用的拿走,不喜欢的也请不要抨击。
2:iPhone的兼容模式虽然能兼容图片,但是不能自动调整位置。
3:本方法iPad不适用,只适用于4,5,6,6Plus。
4:本方法用在iPhone上的话只需准备4,5的尺寸两套布局。效率高,也方便后期维护。
5:虽然本方法只是非常简单的按比例兼容。只要每张图都有三种分辨率的话,该方法完全不会让图片模糊或者变形。能还原出设计师的最初设计

本博客属于原创,原创不易。转载请声明出处。

时间: 2024-10-03 21:43:33

StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程的相关文章

不使用AutoLayout快速兼容适配iPhone6/6 Plus

转载:http://blog.it985.com/5121.html 声明:本文章是为了后期快速兼容6和6Plus的按比例放大方法,对于部分读者来说可能觉得该方法不妥.但是对于复杂的界面还有急于交付项目的人来说还是有一定帮助的. 现在由于苹果公司出了6和6Plus,让写苹果程序的哥们为了做兼容很头疼.用StoryBoard固然方便,但是后期做兼容要花费太多的时间和精力.使用AutoLayout虽然会在不同尺寸的屏幕下自动布局,但是很多东西还是要自己手动修改,而且使用AutoLayout的话有一个

iOS Autolayout情况下,ViewController嵌套时,childViewController的Frame异常问题

最近项目中,使用Storyboard.AutoLayout开发,某个ViewController中嵌套了多个子ViewController,结果在将其添加到父ViewController时,出现坐标异常问题:追踪代码发现,这是由于AutoLayout状态下,获取Frame数据不准确(或时机不对)导致的,网上找了许久,取长补短,搞到了解决办法,具体如下: 分析: AutoLayout状态下,执行完viewDidLoad.viewWillAppear等方法后,还会执行viewDidLayoutSub

StoryBoard和代码结合 按比例快速兼容iPhone6/6 Plus教程

现在由于苹果公司出了6和6Plus,让写苹果程序的哥们为了做兼容很头疼.用StoryBoard固然方便,但是后期做兼容要花费太多的时间和精力.使用AutoLayout虽然会在不同尺寸的屏幕下自动布局,但是很多东西还是要自己手动修改,而且使用AutoLayout的话有一个弊病,就是无法通过代码来修改StoryBoard上控件的尺寸和位置.使用纯代码搭建界面又会觉得不够直观,要花时间调整布局,虽然方便后期做调整兼容性,但是影响开发效率.当然个人觉得还是代码和StoryBoard结合的方式比较方便.先

StoryBoard和代码结合 按比例快速兼容iPhone6/6 Plus简单教程

文章中的方法有很大的局限性,请谨慎使用! 现在由于苹果公司出了6和6Plus,让写苹果程序的哥们为了做兼容很头疼.用StoryBoard固然方便,但是后期做兼容要花费太多的时间和精力.使用AutoLayout虽然会在不同尺寸的屏幕下自动布局,但是很多东西还是要自己手动修改,而且使用AutoLayout的话有一个弊病,就是无法通过代码来修改StoryBoard上控件的尺寸和位置.使用纯代码搭建界面又会觉得不够直观,要花时间调整布局,虽然方便后期做调整兼容性,但是影响开发效率.当然个人觉得还是代码和

TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向

TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU).只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向多个存储服务器发起并发TCP请求,且所有服务器同时向客户端发送SRU. 出现的问题: 1)         这种多对一的服务器向客

V-3-3 在没有VCenter的情况下,复制虚拟机

在有VCenter的情况下,可以创建一个模板虚拟机后,右键直接克隆一台虚拟机.或者将虚拟机转换为模板后,以模板创建虚拟机. 如果没有VCenter而现在要创建多台相同的虚拟机的时候可以使用模板来创建虚拟机. 这里说到一个情况是在既没有VCenter和模板的情况下,如何快速复制多台相同的虚拟机. 这里参考文档http://jingyan.baidu.com/article/4f34706e346b6fe386b56d5b.html 打开数据存储浏览器,如下图点击按钮新建文件夹. 进入需要复制的模板

iOS自动布局(autolayout)下图片编辑器的实现

在大部分APP(尤其是社交类的,如qq)经常会有更换头像的场景:点击用户加载头像,加载出系统图片,用户点击选中某张图片之后,可以对图片进行放缩和拖动,已更改圆形裁剪框圈定的图片部分.如下图即为qq的头像选取编辑界面: 图1.qq照片编辑界面 界面中可以对图片进行放大.缩小,拖动,白色圆环区域表示点击确定时将要裁剪的范围.留意上图的动画,qq总是能够确保圆环完全被图片所覆盖,如果拖动或者放缩使得图片以外的黑色区域进入了圆环,图片会自动弹回刚好能够完全覆盖的状态,鉴于CSDN上传图片2M的限制,上面

iOS疯狂详解之自动布局(autolayout)下图片编辑器的实现

在大部分APP(尤其是社交类的,如qq)经常会有更换头像的场景:点击用户加载头像,加载出系统图片,用户点击选中某张图片之后,可以对图片进行放缩和拖动,已更改圆形裁剪框圈定的图片部分.如下图即为qq的头像选取编辑界面: 图1.qq照片编辑界面 界面中可以对图片进行放大.缩小,拖动,白色圆环区域表示点击确定时将要裁剪的范围.留意上图的动画,qq总是能够确保圆环完全被图片所覆盖,如果拖动或者放缩使得图片以外的黑色区域进入了圆环,图片会自动弹回刚好能够完全覆盖的状态,鉴于CSDN上传图片2M的限制,上面

(hdu step 1.3.1)FatMouse' Trade(在收入需要一定的付出的情况下求最大收入)

题目: FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5092 Accepted Submission(s): 1530   Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats gua