码迷,mamicode.com
首页 > 移动开发 > 详细

ios7适配一些问题

时间:2015-08-19 16:38:47      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

ios7适配一些问题(http://www.cocoachina.com/ios/20130703/6526.html

1.  如何判断版本

如果你已经开发过ios旧版本的app,现在想适配在ios7上,那如何判断现在的版本类型是一个很有用的办法:

[[[UIDevice currentDevice] systemVersion] floatValue] < 7.0  //如果当前ios版本小于7

 

2.  edgesForExtendedLayout   //视图控制器,四条边不指定

 

在上述代码中,我们没有设置edgesForExtendedLayout的值,所以默认就是UIRectEdgeAll,viewController的view的布局延伸到了整个屏幕(可以看到导航栏、状态栏背景的红色)。

下面是上述代码的效果:

技术分享

 

由此可见,红色的背景延伸到了导航栏和状态栏。

在ios7适配中,布局问题是一个很头痛也很重要的问题,因为在ios7中viewController使用了全屏布局的方式,也就是说导航栏和状态栏都是不占实际空间的,状态栏默认是全透明的,导航栏默认是毛玻璃的透明效果。

方案一:

self.navigationController.navigationBar.translucent = NO;

这句话的意思就是让导航栏不透明且占空间位置,所以我们的坐标就会从导航栏下面开始算起。

方案二:

      self.edgesForExtendedLayout = UIRectEdgeNone;设置不延伸到导航栏的区域

      edgesForExtendedLayout是ios7的新属性,所以在ios7以下设备会出现奔溃现象,解决办法就是先判断在使用,可以通过判断系统 版本,也可以通过判断方法是否可使用

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])

edgesForExtendedLayout默认的值是UIRectEdgeAll就是全部布局的意思,改成UIRectEdgeNone就会和ios7一起的系统版本一样 的效果

这个值只在当前视图有navigationBar或者tabBar时有效,如果是自定义的navigationBar/tabBar,这个值是不起作用的。它标示从上下左右方向页面延伸,也就是导航栏页面也算在视图显示的部分。iOS7默认是全屏布局,取值就是UIRectEdgeAll。self.edgesForExtendedLayout = UIRectEdgeNone才能在iOS 7上显示没有问题。

同理的还有[都是在有navigationBar/tabBar时有效];

 

方案三:

为ios7单独定制位置,通过判断系统版本,个性为ios7定制位置。

       const BOOL is_ios7 = [[[UIDevice currentDevice] systemVersion] floatValue] < 7.0;

       int y= is_ios7 ? 64 : 0;

 

extendedLayoutIncludesOpaqueBars  //不透明的操作栏

这个属性是对前面的补充,如果状态栏是不透明的,view将不会延伸到状态栏,除非将该属性的值设置为YES

 

 

2automaticallyAdjustsScrollViewInsets

该属性在当你的view是UIScrollView或类似的ScrollView(比如UITableView)的时候使用。你想让tableview从导航栏的底部开始显示,否则就无法看到tableview的全部内容(部分cell将会被导航栏挡住),同时你又想在滚动屏幕的时候tableview能充满整个屏幕。此时,设置edgesForExtendedLayout=None没有效果,因为tableview会紧接导航栏开始显示,当你滚动的时候也不会隐藏到导航栏。

这个属性就是为了解决这个问题,如果你由viewcontroller自动调整insents(设置该属性为YES,也是默认设置),它会在table的顶部加上inset,这样显示的时候table就能从导航栏底部开始,而滚动的时候,又能延伸整个屏幕。

automaticallyAdjustsScrollViewInsets = NO的效果:

技术分享

automaticallyAdjustsScrollViewInsets =  YES (默认值)的效果:

技术分享

上面两种情况下,table视图都会滚动到导航栏后面,但是第二种情况下,table视图的显示是紧接导航栏开始的,第一种情况导航栏覆盖了一部分数据。

 

3.      样式

在ios开发中UITableView是最常用的控件,ios7对于UITableView的改动也是非常大的。

1).布局上

上面说的ios7的初始化位置都是从屏幕开始的,但是如果你使用UITableView全屏显示会发现他的位置是正确的,而且导航栏的毛玻璃效果闪闪发亮。那是因为在ios7的controller中增加了automaticallyAdjustsScrollViewInsets 属性,默认值为YES。他的作用就是如果视图中有唯一的ScrollView存在,那么它会自动改变ScrollView中contentView的位置,让其不会让导航栏挡住,也能让ContentView移上去的时候在导航栏后面显示。

当然,然后视图里的ScrollView不满足系统的要求,我们就需要自己控制contentView的位置了:

UIEdgeInsets contentInset = self.tableView.contentInset;

contentInset.top = 64;

[self.tableView setContentInset:contentInset];

这样也就是达到了automaticallyAdjustsScrollViewInsets属性的效果

2.ios7上的tableView样式有很大的改动,尤其是grouped样式下。

我们可以看到ios7中cell的分割线是默认不会画满的,空出的位置大小是会根据cell.imageView的大小决定了。如果你他能跟ios6一样的效果,值需要将cell的separatorInset属性的left值改成0即可。

 

4.      修改样式

ios7statusBar默认色,随背景颜色深浅改变,优先黑色

随背景颜色深浅改变,优先白色

黑色透明

第一步在里面添加设置为:NO        

第二步在入口类中写:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

5.其他问题

背景问题

在中的背景默认是,而中默认是白色

样式问题

在ios7中UIButton默认是没有背景框的,在ios6中有明显的默认边框

 

 

一,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适配一些问题

标签:

原文地址:http://www.cnblogs.com/muyushifang07/p/4742345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!