适配iOS6与iOS7

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

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

时间: 2024-08-01 10:14:27

适配iOS6与iOS7的相关文章

如何去旧工程适配iOS6和iPhone5

苹果每发布一个系统,都够开发者忙活一阵的,更新xcode适配新系统:像iOS4支持Retain需要@2x的图;像iOS5不支持udid;像现在的iOS6和iPhone5要面对的下面的一堆问题. 1.添加Retina 4 launch image,运行工程的时候会主动提示你. 这时候直接点Add就好了.会默认添加一张Default-568h@2x.png的黑图: 不添加的话,程序运行起来会上下有黑边儿的哟 添加完以后的效果 这个地方再啰嗦两句:当透明第一次在群里说要添加这么一张图的时候,我的第一反

iOS兼容开发:让程序同时支持iOS6和iOS7

由于各种原因,我们的程序需要同时支持iOS 7以及之前的版本(例如iOS 6),也就是说开发者不得不同时在iOS 7和iOS 6之间进行开发.实际上开发者对此是比较讨厌的. iOS 7中的布局问题 下面是非常简单的一个程序,运行在iOS 6中的界面: 而要是运行在iOS 7的模拟器中,会看不到label了: 这是为什么呢?我们对其reveal一下看看吧: 从上图可以看出,实际上label躲在NavigationBar后面了.在iOS 7中,苹果引入了一个新的属性,叫做[UIViewControl

使用 Interface Builder 兼容 iOS6 和 iOS7

当你在更新你的App到iOS 7的平台时遇到最大的挑战之一就是确保不要遗忘那些还在使用iOS 6平台的用户,在此我们提供一些建议使你的App应用在iOS 6和iOS 7上同时保留视觉吸引力和技术功能. 文章转载自 开源中国社区 [http://www.oschina.net]

ios6升级ios7图文教程(iphone4/4s/iphone5)

1)首先,打开itunes,点击帮助选项卡,选择下拉菜单中的检查更新.(如下图所示) 2)itunes开始检查更新,检查会有点缓慢,请不要着急点停止.(如下图所示) 3)检查到有来自Apple的新软件,我们只勾选itunes单独的一个更新.然后点击安装1个项.(如下图所示) 4) iTunes开始下载更新.(如下图所示) 5) 下载完毕后,点击安装即可,然后等到安装完毕重新启动iTunes.点击帮助,关于iTunes,可以发现,已经成功升级到当前的最新版本11.1.(如下图所示)

ios中的设计模式之class Clusters

http://www.cocoachina.com/applenews/devnews/2014/0530/8622.html 我对设计模式一直都是一个若有若无的感觉,特别是在手机端开发,觉得用处不是很大,认为设计模式是为了大规模团队合作,分工才能体现出效果.设计模式可以通过分不同的"层"让大家协同开发,相互之间不产生影响.但是最近看法有点改变,觉得还是需要多少了解一些.   天天使用的framework确实是一个庞大的项目,从framework的设计中可以找到很多设计模式的影子,而且

iOS开发拓展篇—音频处理(音乐播放器2)

说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 2.两种方法的分析 可以使用模态的方法,添加一个控制器,让这个控制器和音乐播放控制器类进行关联,脱线,设置标识符且在cell的点击事件中执行segue即可. 步骤说明: (1)在storyboard中新拖入一个控制器,然后设置和playing控制器类相关联. (2)设置手动跳转 (3)设置segue的标识符 (3)跳转代码处理 不推荐使用模态

实例解析iOS中音乐播放器应用开发的基本要点_IOS

一.调整项目的结构,导入必要的素材 调整后的项目结构如下: 二.新建两个控制器(1)新建一个控制器,用于展示音乐文件列表界面,其继承自UITableViewController (2)新建一个控制器,用于展示播放界面,其继承自UIViewController (3)在storyboard中,把之前的控制器删除,换上一个导航控制器,设置tableViewController与之前新建的控制器类进行关联 三.音乐文件列表控制器中基本界面的搭建(1)新建一个音乐文件的模型 根据plist文件建立模型:

ios7适配--navgationbar遮住下面view的处理

3down votefavorite   Have you guys stumbled up on this issue ? Basically in iOS 7 Navigation Controller is rendered over the sub-view I navigated to. In iOS 6 view I navigate to is enclosed between navigation bar and footer. In iOS 7 it looks like su

iOS7第三方应用重设计的解决方案及案例参考

乍看上去,"为iOS7重设计"无非就是新的应用图标.无边框按钮.与导航栏配色相匹配的状态栏等等.不过如果你再深入挖掘一些,便会发现很多耀眼的地方都体现着iOS7的三大设计主题,即"依从.清晰.纵深". 对于某些应用来说,这些改变带来了设计上的极大改善,而另外一些则甚至比从前还要糟糕,不仅可用性被破坏,而且品牌识别效应也大打折扣.本文会围绕着iOS7 UI过渡指南当中提出的一些关键性的设计解决方案,介绍一些比较有代表性的应用案例.如果你正计划着升级自己的产品,或是以i