适配屏幕其实很简单,但为了保持兼容性以及写的代码的通用性,以及最小的改动代码,本人按照如下的一种方式来适配,可以一劳永逸.

1. 先定义几个宏,分辨表示应用可以使用区域的高度,屏幕可用区域的高度,屏幕的宽度

2. 再看看如下图的一些描述

3. 接下来看看适配的代码如何写

#import "RootViewController.h"

#define iOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7 ? YES : NO)

#define APP_HEIGHT  [UIScreen mainScreen].applicationFrame.size.height
#define SCR_HEIGHT  [UIScreen mainScreen].bounds.size.height
#define SCR_WIDTH   [UIScreen mainScreen].bounds.size.width static int STATUS_HEIGHT = 0;
static int EFFECT_HEITHG = 0;
static int OFFSET_HEIGHT = 0;
static int NAV_HEIGHT    = 0; @implementation RootViewController + (void)initialize
{
    if (self == [RootViewController class])
    {
        if (iOS7)
        {
            STATUS_HEIGHT = 20;
            EFFECT_HEITHG = APP_HEIGHT;
            OFFSET_HEIGHT = 20;
            NAV_HEIGHT    = 44;
        }
        else
        {
            STATUS_HEIGHT = 0;
            EFFECT_HEITHG = APP_HEIGHT;
            OFFSET_HEIGHT = 0;
            NAV_HEIGHT    = 0;
        }
    }
} - (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 为了适配简单,任何view的高度都加上一个修正的偏移量
    UIView *testView = [[UIView alloc] initWithFrame:\
                        CGRectMake(0, 0 + OFFSET_HEIGHT + NAV_HEIGHT,
                                   100, 100)];
    testView.backgroundColor = [UIColor redColor];
    [self.view addSubview:testView];
    
    // 为了适配简单,任何view的高度都加上一个修正的偏移量,下面是用来计算距离底部有多大空间的
    UIView *bottomView = [[UIView alloc] initWithFrame:\
                          CGRectMake(0, OFFSET_HEIGHT + EFFECT_HEITHG - 100,
                                     100, 100)];
    bottomView.backgroundColor = [UIColor greenColor];
    [self.view addSubview:bottomView];
} @end

看效果图:

小结:

1. 用最少的代码来适配iOS6与iOS7的横屏

2. 有效屏幕区域与偏移量修正值很关键

附录:

iOS6 与 iOS7 在初始化view的时候一个给了WhiteColor当背景,一个给了clearColor当背景,为了兼容性,请初始化View的时候明确初始化背景颜色类型,视图控制器在初始化的时候也给设置一个明确的背景色.

相关注释:

/*
     4寸屏幕(iOS6 iOS7)
     
     APP_HEIGHT  548
     SCR_HEIGHT  568
     SCR_WIDTH   320
     
     在iOS6中CGRectMake(0, 0, 100, 100)坐标在状态栏以下的20处
     */
    
    /*
     3寸屏幕(iOS6 iOS7)
     
     APP_HEIGHT  460
     SCR_HEIGHT  480
     SCR_WIDTH   320
     在iOS6中CGRectMake(0, 0, 100, 100)坐标在状态栏以下的20处
     */
    
    /*
     iOS 6
     STATUS_HEIGHT  =  0
     EFFECT_HEITHG  =  APP_HEIGHT
     OFFSET_HEIGHT  =  0
     
     iOS 7
     STATUS_HEIGHT  =  20
     EFFECT_HEIGHT  =  APP_HEIGHT
     OFFSET_HEIGHT  =  20
     */

更好的适配方式:

一、没有包装任何 导航控制器 或者 UITabBarController

1.控制器的view是UIScrollView\UITableView\UICollectionView时(控制器是UITableViewController的时候)

- (void)viewDidLoad

{

[super viewDidLoad];

// #ifdef __IPHONE_7_0是判断是否运行在Xcode5环境下,如果在Xcode5环境下才有下面的代码

#ifdef __IPHONE_7_0

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

}

#endif

}

2.控制器的view是普通的UIView,非UIScrollView

#ifdef __IPHONE_7_0

- (void)viewDidLayoutSubviews

{

// iOS7 && 没有包装导航控制器

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0 && self.navigationController == nil) {

CGFloat top = [self.topLayoutGuide length];

// 是否能滚动

if ([self.view isKindOfClass:[UIScrollView class]]) {

UIScrollView *scroll = (UIScrollView *)self.view;

scroll.contentInset = UIEdgeInsetsMake(top, scroll.contentInset.left, scroll.contentInset.bottom, scroll.contentInset.right);

} else {

CGRect bounds = self.view.bounds;

bounds.origin.y =  - top;

self.view.bounds = bounds;

}

}

}

#endif

二、包装有导航控制器的情况

1> 控制器的view不是UIScrollView

#ifdef __IPHONE_7_0

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {

self.edgesForExtendedLayout = UIRectEdgeNone;

}

#endif

2> 控制器的view是UIScrollView

不需要写额外的代码适配

三、其他情况(上述情况不用死机,只要掌握以下几点规律)

1.想让view的内容往下挪动

1> UIView设置bounds的y值

2> UIScrollView设置contentInset的top值

2.防止子控制器的view被导航栏或者tabbar遮住

self.edgesForExtendedLayout = UIRectEdgeNone;

四、多控制器嵌套处理

1.当多重控制器嵌套的时候,最合理的方案是:UITabBarController内部嵌套UINavigationController

2.当UITableViewController的直接父控制器是UINavigationController时,不需要编写任何适配代码

3.其他非UITableViewController需要加上适配代码

#ifdef __IPHONE_7_0

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0) {

self.edgesForExtendedLayout = UIRectEdgeNone;

}

#endif

适配iOS6与iOS7的更多相关文章

  1. IOS6和IOS7的屏幕适配问题

    自从IOS7出来以后,以前写在IOS6上或者更低版本的程序,跑在IOS7的模拟器上就会出现一些问题.最大的问题就是,所有的UI空间都会统一向上移动20个点(如果空间的y值为0,就会被StatusBar ...

  2. iOS6和iOS7代码的适配(3)——坐标适配

    由于iOS7里面status bar和视图是重叠在一起了,所以应用的y坐标就没法和以前一致了,需要重新计算设定.基本上,你的应用用Xcode5运行一下就能看见这个问题,这里写了一个最简单的例子,一个V ...

  3. iOS6和iOS7代码的适配(1)

    苹果的iOS7推出后,对于所有的应用来说都提出了一个天然的需求--适配不同版本的SDK.目前来说,用iOS6的SDK生成的应用,可以在iOS7的系统上跑,UI上也保持了原来的风格样式,这是苹果做的向下 ...

  4. 如何解决iOS6、iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件

    如何解决iOS6.iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件

  5. iOS6和iOS7代码的适配(5)——popOver

    popOver这个空间本身是iPad only的,所以iPhone上见不到,我记得微信上有个这样的弹出框,有扫一扫等几个菜单项,估计这是腾讯自己实现的,用于菜单的扩展. popOver从iOS6到iO ...

  6. ios6和ios7禁止屏幕旋转

    ios6和ios7禁止屏幕旋转 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOr ...

  7. 解决xib布局方式支持ios6,ios7

    xcode5 中的界面布局 根据sdk 分成ios7.0 and Later 和 ios6.1 and Earlier 两种,那如何xib同时支持 ios6 和ios7 的界面呢 方法如下: 在xco ...

  8. iOS6和iOS7代码的适配(4)——tableView

    iOS7上不少控件的样子有了变化(毕竟要扁平化嘛),不过感觉变化最大的肯定非tableView莫属.因为这个控件的高度可定制性,原先是使用及其广泛的,这样的一个改变自然也影响颇大. 1.accesso ...

  9. [操作系统]iOS6与iOS7屏幕适配技巧

    一.没有包装任何 导航控制器 或者 UITabBarController 1.控制器的view是UIScrollView\UITableView\UICollectionView时(控制器是UITab ...

随机推荐

  1. WPF Style和Template

    WPF中的Style类似于Web应用程序中的CSS,它是控件的一个属性,属于资源的一种. ControlTemplate和DataTemplate区别: ControlTemplate用于改变控件原来 ...

  2. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

  3. 如何在.Net Core MVC中为动态表单开启客户端验证

    非Core中的请参照: MVC的验证 jquery.validate.unobtrusive mvc验证jquery.unobtrusive-ajax 参照向动态表单增加验证 页面引入相关JS: &l ...

  4. linux下在线升级nodejs

    因现有项目需要用一个截屏node包,此包必须新版本,所以紧急升级下测试环境nodejs,后续再升级线上,小小试了下node在线升级 方案1,使用npm安装n模块,使用n来升级nodejs 首先要知道n ...

  5. Docker run centos 中文乱码,时区不对 问题解决

    开心得写代码,结果用Docker部署发现中文全是问号... 调了半天编码,最后发现不是代码得问题..坑爹.. dokcer 的 centos镜像不带中文,时区也不是中国,所以要自己设置.. #设置时区 ...

  6. Ionic CLI 升级到最新版本

    由于Ionic 自身也在不停的更新当中, 所以开发者经常会遇到从官方的CLI 命令,在命令行窗口中执行出错的情况. 就比如我一个月之前安装的ionic 2.2.2版本,已不能使用最新的3.2.0 CL ...

  7. mvc中的action验证登录(ActionFilterAttribute)

    方法一 :  1.创建一个全局action过滤器  (在appstart  的filterconfig中注册   filters.Add(new LoginAttribute());)  2.不需要登 ...

  8. .NET创建WebService服务简单的例子

    Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...

  9. WPF中播放声音媒体文件

    这段时间我们小组要给部门的Annual Meeting準备一个WPF的抽奖程序,为了增加程序的有趣性,我们在程序中需要播放背景音乐等.由於对之前从未使用过WPF,所以对其中的声音等媒体文件播放不是很清 ...

  10. java SE 入门之八大内置基本类型(第二篇)

    本文采用eclipse 工具演示,如果您对eclipse 工具不了解,请先学习下 eclipse 工具的使用,这个里面只是简单的介绍下输出和注释: 安装完成eclipse 以后,双击进入 后一次点击 ...