IOS7 兼容適配總結(一)

轉載地址:http://justsee.iteye.com/blog/1945674

 

大笑ios7新增加的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

 

大笑Launch image

原來做ios5,6的啓動畫面時,如果有status bar,我們會考慮做一張高度少20point的圖片,現在ios7的status bar透明瞭,所以Launch image需要做成全屏尺寸。

 

大笑在xcode5中同時預覽ios7和ios7以前的ui樣式:

1、打開需要預覽的xib;

2、打開assistant editor;

3、點擊Manual選擇Pre view


 
 

 

大笑 

判斷ios7:

C代碼  收藏代碼
  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代碼  收藏代碼
  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代碼  收藏代碼
  1. //前提至少運行在xcode4.6有sdk6.1       
  2.   #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1  
  3.        //..........  
  4.        #endif  

 判斷運行時方法:

 

- (BOOL)respondsToSelector:(SEL)aSelector;

例如:

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

 

 大笑ios7中UITableView的cell separator默認不是從最左邊開始

下面兼容低於ios7的版本:

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

 

大笑我這是自定義的xib的cell:本來是透明的uitableview背景,到ios7變成白色(因爲背景是白色):

Java代碼  收藏代碼
  1. 增加:  
  2.  cell.backgroundColor = [UIColor clearColor];//我是由於這層擋住了,大家注意下每一層顏色  

在之前的版本中UITableViewCell的backgroundColor是透明背景的,但是在iOS7中是默認白色背景,如果在TableView後面加入背景的應用要注意了,在創建UITableViewCell的時候把backgroundColor設置爲[UIColor clearColor]

 

大笑UILabel不一致的background

對於UILabel,在iOS 7中它的background顏色默認是clearColor,而在iOS 6中默認的是白色。所以,我們最好在代碼中對label的background顏色進行明確的設置:

Java代碼  收藏代碼
  1. view.backgroundColor = [UIColor clearColor];  

 

大笑我這是自定義的xib的cell:用xib自定義的cell上的按鈕不能響應點擊事件,一種是把按鈕放到cell的contentView上,或者是設置[cell.contentView setUserInteractionEnabled: NO];來屏蔽cell上的點擊事件

 

大笑

如果你最近在做對iOS7的兼容時,發現你的table view cell顯示不正常。這很可能是你以前的用法不對。Table view cell的自定義內容應該作爲 cell.contentView的子view添加到cell中,如果你直接用 [cell addSubView:]方法而不是[cell.contentView addSubView:]方法添加子元素,那麼就可能在iOS7下出來異常的表現。主要原因是iOS7的Table view cell內部實現有了部分變化。

Java代碼  收藏代碼
  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. }  

 

 

大笑在ios5,ios6中正常執行的動畫,但到ios7中不定時的會消失。

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

網上暫時還沒有與這個有關的問題,與這個類似:http://stackoverflow.com/questions/18880584/ios-7-animation-block-not-being-called

 

大笑

視圖控制器接口wantsFullScreenLayout已作廢。如果你像以前那樣地指定wantsFullScreenLayout = NO,iOS 7中視圖控制器會在將其內容顯示到一個意外的屏幕位置。

 

大笑NSString 繪製

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  繪製。

 

大笑navigation controller容器中佈局到ios7中往上偏移了64px

iOS6中默認的佈局將從navigation bar的底部開始,但到了iOS7中默認佈局從navigation bar的頂部開始,這就是爲什麼所有的UI元素都往上漂移了。因爲在iOS7中,蘋果引入了一個新的屬性,叫做[UIViewController setEdgesForExtendedLayout:],它的默認值爲UIRectEdgeAll,使用edgesForExtendedLayout指定視圖的哪條邊需要擴展,不用理會操作欄的透明度。所以這種情況快速修復的方法是:在-(void)viewDidLoad中添加如下一行代碼:

Java代碼  收藏代碼
  1. self.edgesForExtendedLayout = UIRectEdgeNone;  

 

大笑extendedLayoutIncludesOpaqueBars

關於這個屬性的測試版本中默認值是YES,正式版本是NO!

如果你使用了不透明的navigation bar,設置edgesForExtendedLayout 還是默認值UIRectEdgeAll,你又想整個view全屏(navigation bar下面的內容網上漂移64px) extendedLayoutIncludesOpaqueBars 的值設置爲YES。

例如:

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

 然後在需要全屏的UIViewController中設置:

Java代碼  收藏代碼
  1. self.extendedLayoutIncludesOpaqueBars = YES;  

 

大笑隱藏狀態條

原來在ios6中是:

Java代碼  收藏代碼
  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代碼  收藏代碼
  1. - (BOOL)prefersStatusBarHidden  
  2. {  
  3.     return YES;  
  4. }  
大笑
升級到ios7 ,默認狀態欄是透明的,就是狀態欄只有文字沒有背景。現在的情況是,默認是會疊合的,開發需要從20px像素以下開始佈局頁面元素才能避免。


 

大笑 狀態欄樣式修改:

在在UIViewController或子類中實現以下兩個方法:

Java代碼  收藏代碼
  1. - (BOOL)prefersStatusBarHidden  
  2. {  
  3.     return YES;  
  4. }  
  5. - (UIStatusBarStyle)preferredStatusBarStyle{  
  6.     return UIStatusBarStyleLightContent;  
  7. }  

 在需要刷新狀態欄樣式的時候,調用

Java代碼  收藏代碼
  1. - (void)setNeedsStatusBarAppearanceUpdate   


 

 

 大笑在iOS7 UINavigationController中側滑手勢返回

假如你自定義leftBarButtonItem,返回手勢會失效,需要實現:

Java代碼  收藏代碼
  1. self.navigationController.interactivePopGestureRecognizer.delegate = self;  

 假如你沒有自定義leftBarButtonItem或其他需求而不需要手勢,必須實現:

 

Java代碼  收藏代碼
  1. self.navigationController.interactivePopGestureRecognizer.enabled = NO;  

 

 大笑

在iOS 6 中,tintColor 可以用來給導航欄的背景着色、tab 欄、工具欄、搜索欄、搜索欄的 範圍選擇欄着色。而在iOS 7 中,給背景着色只需要使用barTintColor 屬性就可以了,所以iOS7中barTintColor 取代原有的 tintColor, 原有的tintColor只修改對應bar上的按鈕顏色。

 

大笑Navigation Bar



 

也就是說如果設置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

 

大笑 UIBarButtonItem

在iOS7中自定義的 UIBarButtonItem 所有的item向中間偏移了,如果需要適配ios6的風格需要修改

簡單處理:

 

Java代碼  收藏代碼
  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代碼  收藏代碼
  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  
 

 大笑

 

- (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代碼  收藏代碼
  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:

 

 大笑

 ios7新增的屬性sectionIndexBackgroundColor,在索引沒有被觸摸時默認是白色。

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

 

大笑在ios7 ipad中tabbar高度不是49

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



#ifndef kCFCoreFoundationVersionNumber_iOS_6_1
#define kCFCoreFoundationVersionNumber_iOS_6_1 793.00
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
#define IF_IOS7_OR_GREATER(...) \
if (kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iOS_6_1) \
{ \
__VA_ARGS__ \
}
#else
#define IF_IOS7_OR_GREATER(...) 
#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章