1、iOS7.0新增加的icon尺寸

76 x 76:Size for iPad 2 and iPad mini (standard resolution)

120 x 120:Size for iPhone  and iPod touch (high resolution)

152 x 152: Size for iPad and iPad mini (high resolution)

参考:

http://blog.manbolo.com/2013/08/15/new-metrics-for-ios-7-app-icons

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/IconMatrix.html

2、Launch p_w_picpath

       原来做iOS5.0,6.0的启动画面时,如果有status bar,我们会考虑做一张高度少20point的图片,现在 iOS7.0 的status bar透明了,所以Launch p_w_picpath需要做成全屏尺寸。

3、在xcode5中同时预览 iOS7.0 和 iOS7.0 以前的ui样式

1、打开需要预览的xib;

2、打开assistant editor;

3、点击Manual选择Pre view

iOS 兼容iOS7.0_iOS7 新特性


iOS 兼容iOS7.0_iOS7 新特性_02

4、判断iOS7.0

  1. #define NLSystemVersionGreaterOrEqualThan(version) ([[[UIDevice currentDevice] systemVersion] floatValue] >= version)

  2. #define IOS7_OR_LATER NLSystemVersionGreaterOrEqualThan(7.0)

  3. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1

  4. if (IOS7_OR_LATER) {  

  5. //适配7的代码,这里是在sdk7,ios7中代码

  6.        }  

  7. #endif

  8. //xcode4.6  支持run ios7

ps:一个不错的宏:

  1. #ifndef kCFCoreFoundationVersionNumber_iOS_6_1  

  2. #define kCFCoreFoundationVersionNumber_iOS_6_1 793.00

  3. #endif  

  4. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  

  5. #define IF_IOS7_OR_GREATER(...) \  

  6. if (kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1) \  

  7. { \  

  8. __VA_ARGS__ \  

  9. }  

  10. #else

  11. #define IF_IOS7_OR_GREATER(...)  

  12. #endif  


判断SDK7:

  1. //前提至少运行在xcode4.6有sdk6.1    

  2.  #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  

  3. //..........

  4.       #endif  


判断运行时方法:

- (BOOL)respondsToSelector:(SEL)aSelector;

例如:

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

  2. {  

  3.    self.edgesForExtendedLayout = UIRectEdgeNone;  

  4. }  

5、iOS7.0中UITableView的cell separator默认不是从最左边开始

       下面兼容低于ios7的版本:

  1. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000

  2. if (IOS7_OR_LATER) {  

  3.            [tabelView setSeparatorInset:UIEdgeInsetsZero];//

  4.        }  

  5. #endif  

6、UITableViewcell:本来是透明的UITableView背景,到iOS7.0变成白色(因为背景是白色)

      在之前的版本中UITableViewCell的backgroundColor是透明背景的,但是在iOS7中是默认白色背景,如果在TableView后面加入背景的应用要注意了,在创建UITableViewCell的时候把backgroundColor设置为[UIColor clearColor]。

7、UILabel不一致的background

      对于UILabel,在iOS 7.0中它的background颜色默认是clearColor,而在iOS 6.0中默认的是白色。所以,我们最好在代码中对label的background颜色进行明确的设置:

  1. view.backgroundColor = [UIColor clearColor];  

8、自定义UITableViewCell上的按钮不能响应点击事件

       解决方案:1、把按钮放到cell的contentView上。

                         2、设置[cell.contentView setUserInteractionEnabled: NO];来屏蔽cell上的点击事件。

       如果你最近在做对 iOS7.0 的兼容时,发现你的table view cell显示不正常,这很可能是你以前的用法不对。TableViewCell的自定义内容应该作为 cell.contentView的子view添加到cell中,如果你直接用 [cell addSubView:]方法而不是[cell.contentView addSubView:]方法添加子元素,那么就可能在 iOS7.0 下出来异常的表现。主要原因是 iOS7.0 的Table view cell内部实现有了部分变化。

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  

  2. {  

  3. UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"cellIdentifier"];  

  4. UIView * subview = [[XXView alloc] init];  

  5. subview.userInteractionEnabled = NO;// 不设为NO会屏蔽cell的点击事件

  6. subview.backgroundColor = [UIColor clearColor];// 设为透明从而使得cell.backgroundColor有效.

  7. subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;  

  8. [cell.contentView addSubview:subview];// cell.contentView是个readonly属性,所以别想着替换contentView了.

  9. return cell;  

  10. }  

9、在iOS5.0,iOS6.0中正常执行的动画,但到iOS7.0中不定时的会消失

       解决方案:在可能消失的地方加上“[UIView setAnimationsEnabled:YES]”,比如action方法,viewWillappear方法等。网上暂时还没有与这个有关的问题,与这个类似:http://stackoverflow.com/questions/18880584/ios-7-animation-block-not-being-called

10、视图控制器接口wantsFullScreenLayout已作废

      如果你像以前那样地指定wantsFullScreenLayout = NO,iOS 7中视图控制器会将其内容显示到一个意外的屏幕位置。

11、NSString 绘制

       iOS7.0 下使用 - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs进行绘制,需要定义attributes,对样式进行定义。

      例如attributes是@{NSFontAttributeName:[UIFont systemFontOfSize:8], NSStrokeColorAttributeName:[[UIColor greenColor] colorWithAlphaComponent:0.5]},但这个属性会影响上下文。

       iOS7.0 之前使用 - (CGSize)drawAtPoint:(CGPoint)point withFont:(UIFont *)font  绘制。

12、navigation controller容器中布局到ios7中往上偏移了64px

       iOS6.0中默认的布局将从navigation bar的底部开始,但到了iOS7.0中默认布局从navigation bar的顶部开始,这就是为什么所有的UI元素都往上漂移了。因为在iOS7.0中,苹果引入了一个新的属性,叫做[UIViewController setEdgesForExtendedLayout:],它的默认值为UIRectEdgeAll,使用edgesForExtendedLayout指定视图的哪条边需要扩展,不用理会操作栏的透明度。所以这种情况快速修复的方法是:在-(void)viewDidLoad中添加如下一行代码:

  1. self.edgesForExtendedLayout = UIRectEdgeNone;  

13、extendedLayoutIncludesOpaqueBars

       关于这个属性的测试版本中默认值是YES,正式版本是NO!

       如果你使用了不透明的navigation bar,设置edgesForExtendedLayout 还是默认值UIRectEdgeAll,你又想整个view全屏(navigation bar下面的内容往上漂移64px):extendedLayoutIncludesOpaqueBars 的值设置为YES。

       例如:

  1. 在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中给uinavigationbar设置背景图片使之不透明:  

  2.    CGSize p_w_picpathSize = CGSizeMake(1, 1);  

  3.    UIGraphicsBeginImageContextWithOptions(p_w_picpathSize, YES, 0);  

  4.    [[UIColor greenColor] set];  

  5.    UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, p_w_picpathSize.width, p_w_picpathSize.height)];  

  6.    [path fill];  

  7.    UIImage *p_w_picpath = UIGraphicsGetImageFromCurrentImageContext ();  

  8.    UIGraphicsEndImageContext();  

  9.    [[UINavigationBar appearance] setBackgroundImage:p_w_picpath forBarMetrics:UIBarMetricsDefault];  

        然后在需要全屏的UIViewController中设置:

  1. self.extendedLayoutIncludesOpaqueBars = YES;  

14、隐藏状态条

       在 iOS6.0 中是:

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  

  2. {  

  3. // Override point for customization after application launch.

  4.    [[UIApplication sharedApplication] setStatusBarHidden:YES];  

  5. return YES;  

  6. }  

       现在在 iOS7.0 中无效了。

快速解决:

       在项目plist文件中修改为:

       View controller-based status bar appearance 的值为NO。

       但是我认为这个快速解决是没有按照苹果的思路来解决的,而且会有些问题,比如,当你在某个界面隐藏了status bar,退回到上一个界面时,status bar仍然是隐藏的。 首先,苹果把View controller-based status bar appearance默认的值设为YES,是有他的道理的,新系统下,苹果希望我们的viewcontroller去控制status bar,也就是说,我们大多数的界面应该是统一的,偶尔一些viewcontroller需要status bar特殊控制的,完全交给当前的viewcontroller来做。那么推荐解决方案:

       保持View controller-based status bar appearance 的默认值为YES,然后在ViewController中重写prefersStatusBarHidden方法:

  1. - (BOOL)prefersStatusBarHidden  

  2. {  

  3. return YES;  

  4. }  

15、升级到iOS7.0 ,默认状态栏是透明的,就是状态栏只有文字没有背景

       现在的情况是,默认是会叠合的,开发需要从20px像素以下开始布局页面元素才能避免。


iOS 兼容iOS7.0_iOS7 新特性_03

16、状态栏样式修改

       在在UIViewController或子类中实现以下两个方法:

  1. - (BOOL)prefersStatusBarHidden  

  2. {  

  3. return YES;  

  4. }  

  5. - (UIStatusBarStyle)preferredStatusBarStyle{  

  6. return UIStatusBarStyleLightContent;  

  7. }  

在需要刷新状态栏样式的时候,调用

  1. - (void)setNeedsStatusBarAppearanceUpdate  

iOS 兼容iOS7.0_iOS7 新特性_04

17、在iOS7 UINavigationController中侧滑手势返回

       假如你自定义leftBarButtonItem,返回手势会失效,需要实现:

  1. self.navigationController.interactivePopGestureRecognizer.delegate = self;  

       假如你没有自定义leftBarButtonItem或其他需求而不需要手势,必须实现:

  1. self.navigationController.interactivePopGestureRecognizer.enabled = NO;  

18、tintColor

       在iOS 6 中,tintColor 可以用来给导航栏的背景着色、tab 栏、工具栏、搜索栏、搜索栏的范围选择栏着色。而在iOS 7 中,给背景着色只需要使用barTintColor属性就可以了,所以iOS7中barTintColor 取代原有的 tintColor,原有的tintColor只修改对应bar上的按钮颜色。

19、Navigation Bar

iOS 兼容iOS7.0_iOS7 新特性_05

iOS 兼容iOS7.0_iOS7 新特性_06
   如果设置Navigation Bar的图片,并且这个图片高度保持在44point(88px),那么IOS5、6、7的效果是一致的。

      参考:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html#//apple_ref/doc/uid/TP40013174-CH8-SW1

20、UIBarButtonItem

      在 iOS7.0 中自定义的 UIBarButtonItem 所有的item向中间偏移了,如果需要适配 iOS6.0 的风格需要修改。

      简单处理:

  1. UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]  

  2.                                 initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace  

  3.                                 target:nil action:nil];  

  4. negativeSpacer.width = -16;// it was -6 in iOS 6

  5. [self.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, requriedButton/*this will be the button which u actually need*/, nil] animated:NO];  

      如果想不修改源代码,例如setLeftBarButtonItem等方法,可以在category中覆盖:
  1. #import"UINavigationItem+PtHelper.h"

  2. @implementation UINavigationItem (PtHelper)  

  3. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  

  4. - (void)setLeftBarButtonItem:(UIBarButtonItem *)_leftBarButtonItem  

  5. {  

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

  7.    {  

  8.        UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];  

  9.        negativeSeperator.width = -16;  

  10. if (_leftBarButtonItem)  

  11.        {  

  12.            [self setLeftBarButtonItems:@[negativeSeperator, _leftBarButtonItem]];  

  13.        }  

  14. else

  15.        {  

  16.            [self setLeftBarButtonItems:@[negativeSeperator]];  

  17.        }  

  18.        [negativeSeperator release];  

  19.    }  

  20. else

  21.    {  

  22.        [self setLeftBarButtonItem:_leftBarButtonItem animated:NO];  

  23.    }  

  24. }  

  25. - (void)setRightBarButtonItem:(UIBarButtonItem *)_rightBarButtonItem  

  26. {  

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

  28.    {  

  29.        UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];  

  30.        negativeSeperator.width = -10;  

  31. if (_rightBarButtonItem)  

  32.        {  

  33.            [self setRightBarButtonItems:@[negativeSeperator, _rightBarButtonItem]];  

  34.        }  

  35. else

  36.        {  

  37.            [self setRightBarButtonItems:@[negativeSeperator]];  

  38.        }  

  39.        [negativeSeperator release];  

  40.    }  

  41. else

  42.    {  

  43.        [self setRightBarButtonItem:_rightBarButtonItem animated:NO];  

  44.    }  

  45. }  

  46. #endif  

  47. @end

21、sizeWithFont

       - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode  在ios7中过期。

       在ios7中使用:

       - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context

       例如:

  1. CGSize size = CGSizeMake(screenSize.width - self.horizontalMargin * 4.f, 1000.f);  

  2. if(IOS7_OR_LATER){  

  3.           CGRect textRect = [text boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:font} context:nil];  

  4.           self.contentWidth = self.contentWidth!=0.f?self.contentWidth:textRect.size.width;  

  5.           self.contentHeight = self.contentHeight!=0.f?self.contentHeight:textRect.size.height;  

  6.       }else{  

  7.           CGSize  textSize = [text sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeWordWrap];  

  8.           self.contentWidth = self.contentWidth!=0.f?self.contentWidth:textSize.width;  

  9.           self.contentHeight = self.contentHeight!=0.f?self.contentHeight:textSize.height;  

  10.       }  

https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context:

22、sectionIndexBackgroundColor

       iOS7.0 新增的属性sectionIndexBackgroundColor,在索引没有被触摸时默认是白色。

  1. if (IS_IOS_7) {  

  2.        self.playersTableView.sectionIndexBackgroundColor = [UIColor clearColor];  

  3. //        self.playersTableView.sectionIndexTrackingBackgroundColor = [UIColor clearColor];

  4.    }  

23、iOS7 ipad中tabbar高度不是49,是56

24、barTintColor

barTintColor只有在 iOS7.0 中才能使用,任何使用barTintColor设置背景色的方法在iOS7.0以下的版本都可能会导致程序崩溃。如使用控件UIToolBar。

25、selectedBackgroundView

       使用 cell.selectedBackgroundView.backgroundColor 设置UITableViewCell选中后的颜色在iOS7.0下有效,而在iOS6.0中会无效。

   解决方案有两种:

  1、自定义 UITableViewCell 可在初始化时设定选中后的颜色

  1. self.backgroundColor = [UIColor clearColor];

  2. self.contentView.backgroundColor = [UIColor clearColor];

  3. self.selectedBackgroundView = [[UIView alloc] initWithFrame:self.bounds];

  4. self.selectedBackgroundView.backgroundColor = [UIColor colorWithRed:237.0f/255.0f green:237.0f/255.0f blue:237.0f/255.0f alpha:1];

  5. self.accessoryType = UITableViewCellAccessoryNone;

  2、使用系统默认 UITableViewCell


  1. UIView *view = [[UIView alloc] initWithFrame:CGRectZero];

  2. cell.selectedBackgroundView = view;

  3. cell.selectedBackgroundView.backgroundColor = [UIColor colorWithRed:237.0f/255.0f green:237.0f/255.0f blue:237.0f/255.0f alpha:1];

26、UISwitch

iOS7.0下UISwitch的尺寸是51*31,而在iOS7.0以下版本中的尺寸是79*27。位置也有变化。

      解决方案:

      1、位置变化可通过调节center来修改。

      2、如果想在iOS7.0和iOS7.0以下版本中保持UISwitch一致,只能通过自定义UISwitch实现。

27、如果设置了self.navigationController.navigationBar 设置了UIBarMetricsLandscapePhone的背景;而没有设置UIBarMetricsDefault的背景,navigationBar会变透明
如图所示: navigationBar透明

iOS 兼容iOS7.0_iOS7 新特性_07

28、上图还出现了一个问题,如果没有设置self.automaticallyAdjustsScrollViewInsets = NO,那么iOS7下会自动让scrollView滑动多次,以满足UITableView第一行的显示需要,这又带来了另外一个问题,下拉刷新的View的frame也随之发生了改变,导致整个下拉刷新不可用了
29、self.automaticallyAdjustsScrollViewInsets 这个属性是IOS7才有的新方法,目的就是为了让scrollView自动适应屏幕,如果self.automaticallyAdjustsScrollViewInsets = NO,那么效果会变成下图所示:

iOS 兼容iOS7.0_iOS7 新特性_08

如果ViewController继承的是UITableViewController,所以TableView是随系统而产生的,在IOS7之前,tableView的Frame的起始点是(0, 20),在IOS7之后,它的起始点变成了(0,0),这个时候如果为了让下拉刷新能正常工作,必须设置self.edgesForExtendedLayout = UIRectEdgeNone(这种情况适用于容器建立在UINavigationController).
30、如果设置了self.navigationController.navigationBar 设置UIBarMetricsDefault的背景为空,则默认的是IOS7上边栏平铺效果,如果设置了图片,并且这个图片高度保持在44(88),那么IOS5,6,7的效果是一致的。
31、iOS7中的StatusBar的没有了背景,他的UIStatusBarStyleLightContent和UIStatusBarStyleDefault只会改变StatusBar的文字,都不会有背景。
32、ViewController-Based Status Bar Appearance控制了StatusBar的外观,如果设置为YES,则会调用preferredStatusBarStyle。如果为NO,则通过传统方式来控制
下图示IOS6,7上的正常情况

iOS 兼容iOS7.0_iOS7 新特性_09

iOS 兼容iOS7.0_iOS7 新特性_10


iOS 兼容iOS7.0_iOS7 新特性_11

33、在IOS7下,如果不设置navigationBar的背景图片,而且设置[navigationBarsetBarStyle:UIBarStyleBlackTranslucent];可以获取默认的黑色毛玻璃效果哟


iOS 兼容iOS7.0_iOS7 新特性_12