IOS研究之iOS7适配的使用详细说明

近日,我对项目进行了iOS7适配,迟迟没有使用7.0SDK是因为旧工程使用iOS7.0有一些问题,趁着这次机会,我详细整理了适配iOS7需要注意的几个地方。记录如下:
一,iOS7 UITableViewCell适配
(1)iOS7 UITableViewCell背景色
在iOS7之前UITableViewCell的backgroundColor是透明的,但在iOS7中默认白色背景,如果使用iOS7 SDK的UITableViewCell显示不正常,只需要需修改:
[cell setBackgroundColor:[UIColor clearColor]];
(2)iOS7 UITableViewCell层次关系
iOS7之前,遇到UITableViewCell上的UIButton子视图找到该UITableViewCell时,也许会有这样的代码: [[sender superview] superview]
这段代码在iOS7上肯定会崩溃。
iOS7以前,我们一般是把视图添加到UITableViewCell的contentView上,contentView的父视图是
UITableViewCell,上面的代码是没有问题的。但在iOS7上,UITableViewCell的contentView的父视图是
UITableViewCellContentView[SDK中好像没有这个类的详细介绍],所以 [[sender superview]
superview]就找不到UITableViewCell。对UiscrollView不明确的看IOS研究之滚动视图UIScrollView的简单应用
实际上这里的正确做法应该是:
在继承UITableView的类中实现UIButton的触发方法:

1

2

3

4

5

6

-(void)buttonClick:(UIButton
*)button{

CGPoint buttonPosition
= [button
convertPoint:CGPointZero
toView:self];

NSIndexPath *indexPath
= [self
indexPathForRowAtPoint:buttonPosition];

UITableViewCell *cell
= (UITableViewCell *)[self
cellForRowAtIndexPath:indexPath];

//do  something

}

二,iOS7 UIViewController适配
最大的变化是UIViewController默认都是全屏显示的。
(1)导航栏高度
iOS7之前导航栏高度为44,iOS7是全屏布局,导航栏高度包括了状态栏高度20变成了64。如果不适配状态栏就会把导航栏遮住。
(2)edgesForExtendedLayout
有如下取值
UIRectEdgeNone   = 0,
UIRectEdgeTop    = 1 << 0,
UIRectEdgeLeft   = 1 << 1,
UIRectEdgeBottom = 1 << 2,
UIRectEdgeRight  = 1 << 3,
UIRectEdgeAll
这个值只在当前视图有navigationBar或者tabBar时有效,如果是自定义的navigationBar/tabBar,这个值是不起作用
的。它标示从上下左右方向页面延伸,也就是导航栏页面也算在视图显示的部分。iOS7默认是全屏布局,取值就是UIRectEdgeAll。如果之前是通
过iOS 6.0SDK编译的,估计就要改成
self.edgesForExtendedLayout = UIRectEdgeNone才能在iOS 7上显示没有问题。
同理的还有[都是在有navigationBar/tabBar时有效];
self.extendedLayoutIncludesOpaqueBars = NO;
指定了当Bar使用了不透明图片时,视图是否延伸至Bar所在区域,默认值时NO。所以我们如果自定义了导航栏的背景图片,那么视图会从导航栏以下开始,不会延伸到导航栏区域。
self.modalPresentationCapturesStatusBarAppearance = NO;
self.tabBarController.tabBar.translucent = NO;
self.navigationController.navigationBar.translucent = NO;//设置导航栏半透明效果
(3)automaticallyAdjustsScrollViewInsets
第一个添加到UIViewController上的UIView,如UIScrollView(包括其子类,比如UITableVie)等会自动在顶部和
底部预留一些空白,主要是为了滚动经过半透明导航条或者tabbar下是能看到的半透明的效果,是否预留空白可以由UIViewController的
automaticallyAdjustsScrollViewInsets的这个属性控制。

三,iOS7 状态栏
涉及状态栏操作的XXX-info.plist属性有如下几个:
Status bar style
Status bar is initially hidden
Status bar tinting parameters
View controller-based status bar appearance
其中Status bar is initially hidden,Status bar style(tekuba.net测试好像在iOS6上不起作用)分别标示全局的设置:状态栏是否隐藏,以及状态栏的风格。
对应着的代码分别是:
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
一般情况下,我们希望程序启动时隐藏状态栏而程序启动完成进入前台后显示状态栏,这个时候就可以设置plist文件的Status bar is
initially hidden为YES,先隐藏状态栏,然后在didFinishLaunchingWithOptions方法中设置:
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO]显示状态栏。
1,iOS7以前不能针对每一个UIViewController单独控制状态栏的显示隐藏,只能在需要的时候调用setStatusBarHidden/setStatusBarStyle修改状态栏显示或者样式
2,iOS7以后,状态栏是透明的。
plist参数多了一个View controller-based status bar appearance。
如果View controller-based status bar appearance为NO,则标示状态栏不受UIViewController的单独控制,那么这个时候状态栏的控制还和iOS7以前的方式一样,在需要修改的地方执行setStatusBarHidden。
而如果设置为YES,则状态栏会根据各个UIViewController的配置改变,UIViewController中如果需要改变状态栏则需要重载以下两个方法:

- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;//状态栏样式
}

- (BOOL)prefersStatusBarHidden
{
return NO;//状态栏是否隐藏
}

1

2

3

4

5

6

7

8

9

- (UIStatusBarStyle)preferredStatusBarStyle

{

return UIStatusBarStyleLightContent;//状态栏样式

}

- (BOOL)prefersStatusBarHidden

{

return NO;//状态栏是否隐藏

}

UIViewController初始化的时候会自动执行这个两个方法,之后如果需要刷新状态栏样式的时候,调用[self setNeedsStatusBarAppearanceUpdate]即可,系统会自动调用这两个方法。

四,具体实施
如果是使用了系统自带的导航栏和标签栏,则按照以上设置基本上就会没有问题。如果是自定义的导航栏和标签栏,需要做些小改动:
//判断是否ios7
#define isIOS7  ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
#define NAV_HEIGHT ( isIOS7 ? 64 : 44)  //导航栏高度
#define NAV_HEIGHT_NO_STATUSVIEW 44  //导航栏高度-不包含状态栏
#define NAV_START_Y (NAV_HEIGHT – NAV_HEIGHT_NO_STATUSVIEW)//导航栏绘制时的起始Y值
创建windows时
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
在使用时创建自定义的导航栏高度为NAV_HEIGHT,绘制自定义视图的开始Y坐标为NAV_START_Y。

另外在一些地方也许还需要加上:

if (isIOS7) {
self.automaticallyAdjustsScrollViewInsets = NO;
}

1

2

3

if (isIOS7) {

self.automaticallyAdjustsScrollViewInsets = NO;

}

时间: 2024-10-05 05:32:35

IOS研究之iOS7适配的使用详细说明的相关文章

IOS 6和 IOS7适配的一些问题

由于在做一个ios的通用设计平台,那么客户端解析的时候就涉及到一些ios不同版本,不同分辨率的适配问题 首先碰到的就是navigation bar中的item的背景色的问题 在ios7中设置settintcolor背景是透明的,图标和字默认是白色的,效果不错,但是在ios 6是,背景色也被设置成了白色,还加了边框,难看了,那怎么办呢,目前还正在摸索中啊 第二个问题就是色彩的透明度的问题,比较奇怪,在设置tableview的cell的背景色的时候,初始时是一样的,点着点着就不一致了,在ios 6和

IOS研究之App转让流程须知详细介绍

 网络上有很多开发者提问怎么转让App并想知道具体的流程.实际上Appstore的App转让流程还是比较简单的,下面特酷吧根据自己的实际操作总结下iOS Appstore中App的转让流程,供大家参考.对网络开发不明白的朋友可以看IOS研究之网络编程Cocoa Streams使用详解 一,App的转让 (1)App转让的条件 至少有在Appstore上发售的版本,即应用状态为:"ready for sale".其他一些条件参考itunes connect中应用详情页面点击"

[转载]IOS研究之App转让流程须知详细介绍

原文地址:http://www.tuicool.com/articles/uQRF3yM 网络上有很多开发者提问怎么转让App并想知道具体的流程.实际上Appstore的App转让流程还是比较简单的,下面特酷吧根据自己的实际操作总结下iOS Appstore中App的转让流程,供大家参考.对网络开发不明白的朋友可以看  IOS研究之网络编程Cocoa Streams使用详解 一,  App的转让 (1)App转让的条件 至少有在Appstore上发售的版本,即应用状态为:”ready for s

IOS研究之IOS7四种后台机制

 IOS 7中,实际上APP拥有四种后台模式,无论是哪一种后台机制,均需要利用苹果给予的相应后台接口实现.IOS7系统中,开发者可以灵活利用多种后台接口(API)实现更加智能的应用操作.对获取开机累计时间不了解的看NSProcessInfo获取系统开机累计时间 一,无后台仅推送 第一种后台方式为传统的无后台操作,仅有苹果推送机制,这种方式出现在iOS 3.x以下的大部分系统版本上.这个方式下,应用在按下Home键后即会关闭退出,其数据通过苹果搭建的推送服务器传输,并不需要应用后台运行.这种方

IOS研究之CoreAnimation(2)-CALayer和CATransaction的详细教程

CoreAnimation是作用在CALayer上的,本部分总结了CoreAnimation的基础CALayer和CATransaction 一,CALayer UIView能显示的关键是它有一个CALayer的属性,我们可以通过设置CALayer对象方便的调整UIView的界面效果比如阴影,圆角等. UIView继承UIResponder,它能响应用户事件.而CALayer直接继承NSObject,只是一个显示的组件.比如如果要显示图片,我们可以使用UIImageView,也可以使用CALay

Ios 6和ios7的适配

Ios 6和ios7的适配 1.普通的 ViewController:让view的显示从状态栏下面开始,只需在viewDidLayoutSubviews调整 view的bounds CGRect bounds = self.view.bounds; bounds.origin.y =  - [self.topLayoutGuide length]; self.view.bounds = bounds; 2.ScrollView 类型的 在viewDidLoad 里面加: if ([[UIDevi

ios7适配一些问题

ios7适配一些问题(http://www.cocoachina.com/ios/20130703/6526.html) 1.  如何判断版本 如果你已经开发过ios旧版本的app,现在想适配在ios7上,那如何判断现在的版本类型是一个很有用的办法: [[[UIDevice currentDevice] systemVersion] floatValue] < 7.0  //如果当前ios版本小于7 2.  edgesForExtendedLayout   //视图控制器,四条边不指定 在上述代

iOS7适配问题

iOS7适配问题 2013-09-28 08:32:37     我来说两句      作者:冻僵的企鹅 收藏    我要投稿 iOS 7发布了,适配问题来了,开发者都忙起来了. 先记一个iOS7 的几个特点: 1.坐标:以屏幕左上角为原点(iOS7以前在状态栏或者导航条下) 2.UIScrollView(包括其子类,比如UITableView):会自动在顶部和底部预留一些空白(因为滚动经过半透明导航条或者tabbar下面,需要能隐约看到的效果),是否预留空白可以由UIViewControlle

ios申请真机调试( xcode 5)详细解析(转载)

目录[-] 第一步:申请"开发证书" 第二步:添加App IDs 第三步:申请设备 第四步:申请描述文件 第一步:申请"开发证书" 进入苹果开发者99美元账号: 选择:Certificates, Identifiers & Profiles 关于 Certificates,Identifiers,Profiles 的介绍请看 "Certificates, Identifiers ,Profiles" 选择:Certificates 选择: