最新消息:文章中包含代码时,请遵守代码高亮规范!

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

iOS Bear 83565浏览 7评论

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

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

@property float autoSizeScaleX;
@property float autoSizeScaleY;

在AppDelegate.m中

#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文件中

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中

//兼容函数
+ (void)storyBoradAutoLay:(UIView *)allView;

在AppDelegate.m中

//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文件中

#import "AppDelegate.h"
- (void)viewDidLoad{
    [super viewDidLoad];
    [AppDelegate storyBoradAutoLay:self.view];
}

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

iPhone6兼容前
iOS Simulator Screen Shot 2014年12月18日 下午7.07.47

iPhone6兼容后
iOS Simulator Screen Shot 2014年12月18日 下午7.06.38

iPhone6Plus兼容前
iOS Simulator Screen Shot 2014年12月18日 下午7.08.29

iPhone6Plus兼容后
iOS Simulator Screen Shot 2014年12月18日 下午6.57.07

如果整个项目做完后才开始做兼容的话这个方法的优势就体现出来了,面对几十个工程文件,只需自定义并且替换你的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:虽然本方法只是非常简单的按比例兼容。只要每张图都有三种分辨率的话,该方法完全不会让图片模糊或者变形。能还原出设计师的最初设计

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

转载时请注明出处及相应链接,本文永久地址:http://blog.it985.com/5121.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Bear的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!

网友最新评论 (7)

  1. 文章很有用,已经收藏,帮了很大忙,感觉这样适配很方便
    xiaohuo2014-12-26 16:27
    • 你按照博主的方法弄好了吗
      ios小白2015-11-17 16:41
  2. 收藏了
    是我始终拒绝成长吗2014-12-28 21:52
  3. 代码写的frame怎么适配啊博主?
    ios小白2015-11-17 16:05
  4. 可以加下我QQ讨论下一些问题吗? 我打算采用你的这个适配方案,但遇到了一些问题. 我qq是: 47331148
    ios小白2015-11-17 16:06
  5. 在storyboard里面,怎么和你这个代码结合还是不太明白
    JXY2015-11-19 17:40
  6. 博主,有写好的demo吗?
    ZBL2015-12-08 15:49