2012年11月20日 星期二

iOS 6版本與之前版本差異

1、4英寸屏幕

舊的應用程式要與4英寸屏幕進行匹配,需要準備一張Default-568h@2x.png圖片,系統根據是否有此資源來識別是否支持4英寸屏幕。

至於其他資源不允許使用xxx-568h.jpg此格式來匹配屏幕,需要使用程式碼對屏幕進行檢測來分別進行匹配。

2、UINavigationViewController的變化

該類的initWithRootViewController在之前的版本是最終會使用到 init 方法的。因此在繼承UINavigationViewController時,直接在重寫 init 方法來初始化物件所需屬性即可。

但是在iOS6上是不會使用init方法,因此需要注意。

3、CFRelease的變化

在之前版本中如果CFRelease傳入 nil 是被允許的,這也符合我們傳入 nil 物件不會對我們的程序造成影響,

但是在iOS6中,這樣的寫法直接就當機了,所以程式碼中還是需要判斷一下是否為 nil 才是安全的做法。

4、UIPickerView的變化

在之前版本中可以使用
[_pickerView selectRow:-1 inComponent:0 animated:YES]; 。

但在iOS6中會導致當機。

5、UIActivityIndi​​catorView的變化

在之前的版本中假如調用了startAnimating方法之後,只要把UIActivityIndi​​catorView添加到子視圖中就會顯示加載動畫,

但在iOS6中只要移出顯示隊列則會停止動畫,特別在UITableViewCell中加入此控件,只要滾動幾下Cell的UIActivityIndi​​catorView就消失了,為解決此問題可以在加入顯示隊列時根據isAnimating屬性來判斷是否執行動畫,如果沒有則重新調用一下startAnimating方法。

6、通訊錄列表獲取差異

自iOS6.0後獲取通訊錄列表需要詢問用戶,經過用戶同意後才可以獲取通訊錄用戶列表。

而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函數轉變為ABAddressBookCreateWithOptions函數。

下面程式碼是獲取通訊錄用戶列表的方法,相容之前的版本。
ABAddressBookRef addressBook = nil;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
{
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意後向下執行
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
} else {
addressBook = ABAddressBookCreate();
}
NSArray *personArray = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);



沒有留言:

張貼留言