兼容sdk7&amp欧洲杯竞猜平台;iOS7的issue解决小片段总结,sdk7.1

过年回来一直搞ios7的项目适配,也算是有些眉目.

兼容sdk7&iOS7的issue解决小片段总结,sdk7.1

欧洲杯竞猜平台 1ios7新增加的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)

参考:

 

欧洲杯竞猜平台 2Launch
image

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

 

欧洲杯竞猜平台 3在xcode5中同时预览ios7和ios7以前的ui样式:

1、打开需要预览的xib;

2、打开assistant editor;

3、点击Manual选择Pre view

欧洲杯竞猜平台 4    
欧洲杯竞猜平台 5  

欧洲杯竞猜平台 6 

判断ios7:

C代码  欧洲杯竞猜平台 7

  1. #define NLSystemVersionGreaterOrEqualThan(version) ([[[UIDevice currentDevice] systemVersion] floatValue] >= version)  
  2. #define IOS7_OR_LATER NLSystemVersionGreaterOrEqualThan(7.0)  
  3.   
  4. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  
  5.         if (IOS7_OR_LATER) {  
  6.            //适配7的代码,这里是在sdk7,ios7中代码  
  7.         }  
  8. #endif  
  9. //xcode4.6  支持run ios7  

ps:一个不错的宏:

Java代码  欧洲杯竞猜平台 8

  1. #ifndef kCFCoreFoundationVersionNumber_iOS_6_1  
  2. #define kCFCoreFoundationVersionNumber_iOS_6_1 793.00  
  3. #endif  
  4.   
  5. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  
  6. #define IF_IOS7_OR_GREATER(…) \  
  7. if (kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1) \  
  8. { \  
  9. __VA_ARGS__ \  
  10. }  
  11. #else  
  12. #define IF_IOS7_OR_GREATER(…)   
  13. #endif  

 

判断SDK7:

 

Java代码  欧洲杯竞猜平台 9

  1. //前提至少运行在xcode4.6有sdk6.1       
  2.   #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  
  3.        //……….  
  4.        #endif  

 判断运行时方法:

 

– (BOOL)respondsToSelector:(SEL)aSelector;

例如:

Java代码  欧洲杯竞猜平台 10

  1. if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])  
  2. {  
  3.     self.edgesForExtendedLayout = UIRectEdgeNone;  
  4. }  

 

 欧洲杯竞猜平台 11ios7中UITableView的cell
separator默认不是从最左边开始

下面兼容低于ios7的版本:

Java代码  欧洲杯竞猜平台 12

  1. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000  
  2.         if (IOS7_OR_LATER) {  
  3.             [tabelView setSeparatorInset:UIEdgeInsetsZero];//  
  4.         }  
  5. #endif  

 

欧洲杯竞猜平台 13我这是自定义的xib的cell:本来是透明的uitableview背景,到ios7变成白色(因为背景是白色):

Java代码  欧洲杯竞猜平台 14

  1. 增加:  
  2.  cell.backgroundColor = [UIColor clearColor];//我是由于这层挡住了,大家注意下每一层颜色  

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

 

欧洲杯竞猜平台 15UILabel不一致的background

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

Java代码  欧洲杯竞猜平台 16

  1. view.backgroundColor = [UIColor clearColor];  

 

欧洲杯竞猜平台 17我这是自定义的xib的cell:用xib自定义的cell上的按钮不能响应点击事件,一种是把按钮放到cell的contentView上,或者是设置[cell.contentView
setUserInteractionEnabled: NO];来屏蔽cell上的点击事件

 

欧洲杯竞猜平台 18

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

Java代码  欧洲杯竞猜平台 19

  1. – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  2.   
  3. {  
  4.   
  5. UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@”cellIdentifier”];  
  6.   
  7. UIView * subview = [[XXView alloc] init];  
  8.   
  9. subview.userInteractionEnabled = NO;// 不设为NO会屏蔽cell的点击事件  
  10.   
  11. subview.backgroundColor = [UIColor clearColor];// 设为透明从而使得cell.backgroundColor有效.  
  12.   
  13. subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;  
  14.   
  15. [cell.contentView addSubview:subview];// cell.contentView是个readonly属性,所以别想着替换contentView了.  
  16.   
  17. return cell;  
  18.   
  19. }  

 

 

欧洲杯竞猜平台 20在ios5,ios6中正常执行的动画,但到ios7中不定时的会消失。

解决方案:在可能消失的地方加上“[UIView
setAnimationsEnabled:YES]”,比如action方法,viewWillappear方法等。

网上暂时还没有与这个有关的问题,与这个类似:

 

欧洲杯竞猜平台 21

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

 

欧洲杯竞猜平台 22NSString
绘制

ios7 下使用

– (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary
*)attrs

进行绘制,需要定义attributes,对样式进行定义。

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

ios7 之前使用 

– (CGSize)drawAtPoint:(CGPoint)point withFont:(UIFont *)font  绘制。

 

欧洲杯竞猜平台 23navigation
controller容器中布局到ios7中往上偏移了64px

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

Java代码  欧洲杯竞猜平台 24

  1. self.edgesForExtendedLayout = UIRectEdgeNone;  

 

欧洲杯竞猜平台 25extendedLayoutIncludesOpaqueBars

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

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

例如:

Java代码  欧洲杯竞猜平台 26

  1. 在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中给uinavigationbar设置背景图片使之不透明:  
  2.     CGSize imageSize = CGSizeMake(1, 1);  
  3.     UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0);  
  4.     [[UIColor greenColor] set];  
  5.     UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];  
  6.     [path fill];  
  7.     UIImage *image = UIGraphicsGetImageFromCurrentImageContext ();  
  8.     UIGraphicsEndImageContext();  
  9.       
  10.     [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];  

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

Java代码  欧洲杯竞猜平台 27

  1. self.extendedLayoutIncludesOpaqueBars = YES;  

 

欧洲杯竞猜平台 28隐藏状态条

原来在ios6中是:

Java代码  欧洲杯竞猜平台 29

  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中无效了。

 

快速解决:

在项目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方法:

 

Java代码  欧洲杯竞猜平台 30

  1. – (BOOL)prefersStatusBarHidden  
  2. {  
  3.     return YES;  
  4. }  

欧洲杯竞猜平台 31 升级到ios7
,默认状态栏是透明的,就是状态栏只有文字没有背景。现在的情况是,默认是会叠合的,开发需要从20px像素以下开始布局页面元素才能避免。
欧洲杯竞猜平台 32  

欧洲杯竞猜平台 33 状态栏样式修改:

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

Java代码  欧洲杯竞猜平台 34

  1. – (BOOL)prefersStatusBarHidden  
  2. {  
  3.     return YES;  
  4. }  
  5. – (UIStatusBarStyle)preferredStatusBarStyle{  
  6.     return UIStatusBarStyleLightContent;  
  7. }  

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

Java代码  欧洲杯竞猜平台 35

  1. – (void)setNeedsStatusBarAppearanceUpdate   

欧洲杯竞猜平台 36  

 

 欧洲杯竞猜平台 37在iOS7 UINavigationController中侧滑手势返回

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

Java代码  欧洲杯竞猜平台 38

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

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

 

Java代码  欧洲杯竞猜平台 39

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

 

 欧洲杯竞猜平台 40

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

 

欧洲杯竞猜平台 41Navigation
Bar

欧洲杯竞猜平台 42  
欧洲杯竞猜平台 43
也就是说如果设置Navigation
Bar的图片,并且这个图片高度保持在44point(88px),那么IOS5,6,7的效果是一致的。 

参考:

 

欧洲杯竞猜平台 44 UIBarButtonItem

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

简单处理:

 

Java代码  欧洲杯竞猜平台 45

  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中覆盖:
Java代码  欧洲杯竞猜平台 46

  1. #import “UINavigationItem+PtHelper.h”  
  2.   
  3. @implementation UINavigationItem (PtHelper)  
  4.   
  5. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  
  6. – (void)setLeftBarButtonItem:(UIBarButtonItem *)_leftBarButtonItem  
  7. {  
  8.     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)  
  9.     {  
  10.         UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];  
  11.         negativeSeperator.width = -16;  
  12.           
  13.         if (_leftBarButtonItem)  
  14.         {  
  15.             [self setLeftBarButtonItems:@[negativeSeperator, _leftBarButtonItem]];  
  16.         }  
  17.         else  
  18.         {  
  19.             [self setLeftBarButtonItems:@[negativeSeperator]];  
  20.         }  
  21.         [negativeSeperator release];  
  22.     }  
  23.     else  
  24.     {  
  25.         [self setLeftBarButtonItem:_leftBarButtonItem animated:NO];  
  26.     }  
  27. }  
  28.   
  29. – (void)setRightBarButtonItem:(UIBarButtonItem *)_rightBarButtonItem  
  30. {  
  31.     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)  
  32.     {  
  33.         UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];  
  34.         negativeSeperator.width = -10;  
  35.           
  36.         if (_rightBarButtonItem)  
  37.         {  
  38.             [self setRightBarButtonItems:@[negativeSeperator, _rightBarButtonItem]];  
  39.         }  
  40.         else  
  41.         {  
  42.             [self setRightBarButtonItems:@[negativeSeperator]];  
  43.         }  
  44.         [negativeSeperator release];  
  45.     }  
  46.     else  
  47.     {  
  48.         [self setRightBarButtonItem:_rightBarButtonItem animated:NO];  
  49.     }  
  50. }  
  51.   
  52. #endif  
  53.    
  54. @end  

 欧洲杯竞猜平台 47

 

– (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

例如:

C代码  欧洲杯竞猜平台 48

  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.        }  

 :

 

 欧洲杯竞猜平台 49

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

Java代码  欧洲杯竞猜平台 50

  1.     if (IS_IOS_7) {  
  2.         self.playersTableView.sectionIndexBackgroundColor = [UIColor clearColor];  
  3. //        self.playersTableView.sectionIndexTrackingBackgroundColor = [UIColor clearColor];  
  4.     }  

 

欧洲杯竞猜平台 51在ios7
ipad中tabbar高度不是49

In iOS 7, a tab bar on iPad has a height of 56 points.

方法一:直接动用Window

windows phone 8 SDK 711

SDK7.1不会兼容于Windows 8, 微软不会发布SDK7.1的更新版本了
 

 

directx sdk 与win7兼容

可以。与64位系统的也兼容
 

ios7新增加的icon尺寸: 76 x 76:Size for iPad 2 and iPad mini (standard
resolution) 120 x 120 :Size for iPhone and iP…

 

#if __IPHONE_OS_VERSION_MAX_ALLOWED>=__IPHONE_7_0

    

        

        [application setStatusBarStyle:UIStatusBarStyleLightContent];

        

       self.window.clipsToBounds =YES;

        

     
  self.window.frame= CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);

        

        //added on 19th Sep

     
  self.window.bounds =CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);

#endif

记得在info.plist里面添上View controller-based status bar appearance
设置为NO

这样项目会显示出status bar

 

 

另外呢 就是一些带有navigation bar
和tabbar的,会发现嵌套在里面的viewcontroller中得view会上移64px,

这个可以选择在viewcontroller里面加上  

self.edgesForExtendedLayout=UIRectEdgeNone;

 

 

当然 用xib的就方便了.

在xcode5上可以调制增量的

首先修改interface builder 

opens in xcode5.0

欧洲杯竞猜平台 52

view as ios7.0

欧洲杯竞猜平台 53

 

记得把下面的use autolayout 的勾去掉

然后设置增量.△这就是在ios7 下运行的时候增加多少..我是这么理解的

欧洲杯竞猜平台 54

 

目前想到了这些,欢迎补充~

.
方法一:直接动用Window #if
__IPHONE_OS_VERSION_MAX_ALLOWED=__IPHONE_7_0 [application
setStatusBarStyle : UISta…

相关文章