背景
剛剛過(guò)完中秋節(jié)删咱,第二天app上線被拒诱咏,原因是因?yàn)閱?dòng)app就會(huì)crash概说,領(lǐng)導(dǎo)大早上給我打電話讓我去公司解決奈懒,好吧誰(shuí)讓人家是領(lǐng)導(dǎo)呢换况!正好iOS10系統(tǒng)剛剛出來(lái)蜓耻,需要適配iOS10而线,不然上線還是會(huì)拒壹罚,所以我果斷升級(jí)了xcode8.0氛驮。我總結(jié)了一些資料腕柜,接下來(lái)介紹一下iOS適配的一些知識(shí)點(diǎn):
1.證書問(wèn)題
- 打開(kāi)xcode8.0時(shí)編譯運(yùn)行時(shí)出現(xiàn)下面問(wèn)題:
這個(gè)問(wèn)題剛開(kāi)始估計(jì)大家都會(huì)碰到也是第一個(gè)要解決的問(wèn)題
這個(gè)問(wèn)題就是一個(gè)證書的設(shè)置問(wèn)題,下面看兩張圖
正常我們會(huì)在BuildeSettings中設(shè)置證書:
但是在xcode8.0中我們看到下面的新特性:
相信大家都能看到在Genreal下面會(huì)有Siging矫废,沒(méi)錯(cuò)這就是新特性盏缤,為了方便用戶來(lái)管理,大家可以選擇Automatically manage signing蓖扑。需要輸入開(kāi)發(fā)者賬號(hào)唉铜!如果沒(méi)有賬號(hào)也沒(méi)關(guān)系,在下面也可以選擇Debug律杠、Realease潭流、inHouse模式下對(duì)應(yīng)的證書也可以!
- 但是 但是 但是 如果你的證書如果是通配符類型的柜去,但是你的app包含了比如推送灰嫉、apple pay、他會(huì)報(bào)錯(cuò)提示你未報(bào)含xx.id的manteid等等嗓奢。所以你要生成針對(duì)你app的bundleid對(duì)應(yīng)的證書讼撒!
2.隱私數(shù)據(jù)訪問(wèn)問(wèn)題
問(wèn)題出現(xiàn)
- 現(xiàn)在app能運(yùn)行了,當(dāng)我打開(kāi)相機(jī)時(shí)突然又crash了股耽,好吧椿肩,坑還不少,崩潰日志如下:
This app has crashed because it attempted to access privacy-sensitive data without a usage description.The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
崩潰原因
- 上面崩潰意思試圖訪問(wèn)安全隱私數(shù)據(jù)豺谈,但是又沒(méi)有相應(yīng)的描述郑象,你必須要包含在info.plist里包含一個(gè)鍵值 NSPhotoLibraryUsageDescription對(duì)應(yīng)的描述。
- 其實(shí)上面是iOS10茬末,蘋果加強(qiáng)了對(duì)隱私數(shù)據(jù)的保護(hù)厂榛,要對(duì)隱私數(shù)據(jù)權(quán)限做一個(gè)適配
iOS10調(diào)用相機(jī)盖矫,訪問(wèn)通訊錄,訪問(wèn)相冊(cè)等都要在info.plist中加入權(quán)限訪問(wèn)描述击奶,不然之前你們的項(xiàng)目涉及到這些權(quán)限的地方就會(huì)直接crash掉辈双。
解決辦法
- 只需要在info.plist添加NSContactsUsageDescription的key, value自己隨意填寫就可以,這里列舉出對(duì)應(yīng)的key(Source Code模式下):
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)相冊(cè)</string>
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)相機(jī)</string>
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)麥克風(fēng)</string>
<key>NSLocationUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App需要您的同意,才能在使用期間訪問(wèn)位置</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始終訪問(wèn)位置</string>
<key>NSCalendarsUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)日歷</string>
<key>NSRemindersUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)提醒事項(xiàng)</string>
<key>NSMotionUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)運(yùn)動(dòng)與健身</string>
<key>NSHealthUpdateUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)健康更新 </string>
<key>NSHealthShareUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)健康分享</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)藍(lán)牙</string>
<key>NSAppleMusicUsageDescription</key>
<string>App需要您的同意,才能訪問(wèn)媒體資料庫(kù)</string>
-
隱私數(shù)據(jù) 對(duì)應(yīng)key值 相冊(cè) NSPhotoLibraryUsageDescription 相機(jī) NSCameraUsageDescription 麥克風(fēng) NSMicrophoneUsageDescription 位置 NSLocationUsageDescription 在使用期間訪問(wèn)位置 NSLocationWhenInUseUsageDescription 始終訪問(wèn)位置 NSLocationAlwaysUsageDescription 日歷 NSCalendarsUsageDescription 提醒事項(xiàng) NSRemindersUsageDescription 運(yùn)動(dòng)與健身 NSMotionUsageDescription 健康更新 NSHealthUpdateUsageDescription 健康分享 NSHealthShareUsageDescription 藍(lán)牙 NSBluetoothPeripheralUsageDescription 媒體資料庫(kù) NSAppleMusicUsageDescription
跳轉(zhuǎn)到app內(nèi)的隱私數(shù)據(jù)設(shè)置頁(yè)面
- 我們知道用戶沒(méi)開(kāi)啟,肯定要提醒用戶去設(shè)置開(kāi)啟的吧柜砾,所以我們要跳轉(zhuǎn)到app的隱私數(shù)據(jù)界面湃望。如何調(diào)用呢,我定義一個(gè)宏方便調(diào)用:
UIKIT_EXTERN NSString *const UIApplicationOpenSettingsURLString NS_AVAILABLE_IOS(8_0);
這個(gè)是iOS8.0以后的方法
//-----------------------系統(tǒng)權(quán)限設(shè)置路徑(iOS8以后適用)---------------------
//url
#define SettingURL [NSURL URLWithString:UIApplicationOpenSettingsURLString]
//調(diào)到設(shè)置
#define GoToSetting if([[UIApplication sharedApplication] canOpenURL:SettingURL]) { \
[[UIApplication sharedApplication] openURL:SettingURL];}}
我們直接調(diào)用下面代碼就可以了
//去設(shè)置
if (IOS8_OR_LATER) {
GoToSetting;
}
看到評(píng)論說(shuō)跳到藍(lán)牙有什么辦法痰驱,我補(bǔ)充一下:
1.首先你在info.plist的文件中添加相應(yīng)權(quán)限
2.在要跳轉(zhuǎn)藍(lán)牙設(shè)置界面添加類#import <CoreBluetooth/CoreBluetooth.h> 并聲明代理<CBCentralManagerDelegate>
3.設(shè)置全局的控件@property (nonatomic, strong)CBCentralManager *testCB;
4.在要跳轉(zhuǎn)的地方寫(最好不要寫局部變量证芭,因?yàn)槟愕媚玫竭@個(gè)CB來(lái)做連接設(shè)備等一些處理。當(dāng)然你要局部變量也沒(méi)關(guān)系担映,你在代理方法也可以拿到CB做處理废士。看個(gè)人喜好了^_^)
if (_testCB) {
_testCB = nil;
_testCB.delegate = nil;
_testCB = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}else{
_testCB = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}
5.若要獲得藍(lán)牙狀態(tài)蝇完,實(shí)現(xiàn)代理方法
-(void)centralManagerDidUpdateState:(CBCentralManager *)central{
}
這樣如果藍(lán)牙關(guān)閉會(huì)提示"打開(kāi)藍(lán)牙來(lái)允許“xxx”連接到配件" 官硝,這樣點(diǎn)擊設(shè)置就可以跳到藍(lán)牙設(shè)置界面了
iOS 10 干掉了所有系統(tǒng)設(shè)置的 URL Scheme,這意味著你再也不可能直接跳轉(zhuǎn)到系統(tǒng)設(shè)置頁(yè)面(比如 WiFi短蜕、蜂窩數(shù)據(jù)氢架、定位等)。
iOS 10中如下跳到系統(tǒng)的設(shè)置方法已經(jīng)不生效了(如果看到解決辦法再補(bǔ)充朋魔,如果你有解決辦法請(qǐng)賜教留下你寶貴的評(píng)論.....感謝):
//代碼失效,謹(jǐn)慎使用
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];
3.系統(tǒng)版本判斷方法失效
- 我們之前的系統(tǒng)版本方法如下
- 當(dāng)系統(tǒng)版本到iOS10.0的時(shí)候 9.0和10.0比較的話是降序而不是升序达箍,這樣會(huì)導(dǎo)致iOS10.0是最早的版本,這樣后面要走的iOS10的方法可能都不會(huì)走而出現(xiàn)問(wèn)題
#define IOS9_OR_LATER ([[[UIDevice currentDevice] systemVersion] compare:@"9.0"] != NSOrderedAscending)
#define IOS8_OR_LATER ([[[UIDevice currentDevice] systemVersion] compare:@"8.0"] != NSOrderedAscending)
#define IOS7_OR_LATER ([[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending)
#define IOS6_OR_LATER ([[[UIDevice currentDevice] systemVersion] compare:@"6.0"] != NSOrderedAscending)
- 下面這樣也不行它會(huì)永遠(yuǎn)返回NO,substringToIndex:1在iOS 10 會(huì)被檢測(cè)成 iOS 1了,
#define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10)
- 正確的打開(kāi)方式應(yīng)該是:
#define IOS10_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0)
#define IOS9_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0)
#define IOS8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
#define IOS7_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IOS6_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
4.UIColor問(wèn)題
- 官方文檔中說(shuō):大多數(shù)core開(kāi)頭的圖形框架和AVFoundation都提高了對(duì)擴(kuò)展像素和寬色域色彩空間的支持.通過(guò)圖形堆棧擴(kuò)展這種方式比以往支持廣色域的顯示設(shè)備更加容易∑坛現(xiàn)在對(duì)UIKit擴(kuò)展可以在sRGB的色彩空間下工作缎玫,性能更好,也可以在更廣泛的色域來(lái)搭配sRGB顏色.如果你的項(xiàng)目中是通過(guò)低級(jí)別的api自己實(shí)現(xiàn)圖形處理的,建議使用sRGB,也就是說(shuō)在項(xiàng)目中使用了RGB轉(zhuǎn)化顏色的建議轉(zhuǎn)換為使用sRGB,在UIColor類中新增了兩個(gè)api:
+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
我用新老方法測(cè)試兩個(gè)方法在RGB相同的數(shù)值在表現(xiàn)上的區(qū)別看下圖:
- 可以看出下面的顏色(sRGB方法)比上面的顏色(RGB方法)顏色更深更明顯。
5.真彩色的顯示
- 真彩色的顯示會(huì)根據(jù)光感應(yīng)器來(lái)自動(dòng)的調(diào)節(jié)達(dá)到特定環(huán)境下顯示與性能的平衡效果,如果需要這個(gè)功能的話,可以在info.plist里配置(在Source Code模式下):
<key>UIWhitePointAdaptivityStyle</key>
它有五種取值,分別是:
<string>UIWhitePointAdaptivityStyleStandard</string> // 標(biāo)準(zhǔn)模式
<string>UIWhitePointAdaptivityStyleReading</string> // 閱讀模式
<string>UIWhitePointAdaptivityStylePhoto</string> // 圖片模式
<string>UIWhitePointAdaptivityStyleVideo</string> // 視頻模式
<string>UIWhitePointAdaptivityStyleStandard</string> // 游戲模式
- 如果你的項(xiàng)目是游戲類的,就選擇UIWhitePointAdaptivityStyleStandard這個(gè)模式,五種模式的顯示效果是從上往下遞減,也就是說(shuō)如果你的項(xiàng)目是圖片處理類的,你選擇的是閱讀模式,給選擇太好的效果會(huì)影響性能.
6.字體變化
- 蘋果的默認(rèn)字體會(huì)隨著iOS系統(tǒng)版本的不同而不同解滓,iOS10中字體變大了赃磨。導(dǎo)致了原來(lái)的顯示有問(wèn)題,會(huì)造成...的出現(xiàn)洼裤。暫時(shí)沒(méi)有好的解決辦法邻辉,需要自己在一個(gè)個(gè)適配一下!
7.插件取消
- Xcode8取消了三方插件的功能腮鞍,好多教程破解可以繼續(xù)使用值骇,但是可能app上線可能會(huì)被拒。我們最喜愛(ài)的VVDocumenter-Xcode也不能使用了移国,下面是作者的感謝
看來(lái)大神都是謙虛的爸ù瘛(啥時(shí)候能成為大神。我還是洗洗睡吧迹缀,夢(mèng)里啥都有^_^) - 上面也提到了我們可以繼續(xù)使用注釋使碾,快捷鍵(? Option + ? Command + / )
8.UIStatusBar的問(wèn)題
- 在iOS10中,如果還使用以前設(shè)置UIStatusBar類型或者控制隱藏還是顯示的方法,會(huì)報(bào)警告,方法過(guò)期,如下圖:
警告中提到從iOS9.0開(kāi)始就棄用這兩個(gè)方法了蜜徽,需要用
-[UIViewController preferredStatusBarstyle]
-[UIViewController preferredStatusBarHidden]來(lái)替換使用,那我們來(lái)看看新的替換方法票摇。
- 新技能見(jiàn)下面
#if UIKIT_DEFINE_AS_PROPERTIES
@property(nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
@property(nonatomic, readonly) BOOL prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
@property(nonatomic, readonly) UIStatusBarAnimation preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade
#else
- (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
- (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade
#endif
- 上面這個(gè)新方法在UIViewController.h文件中拘鞋,這說(shuō)明什么?當(dāng)然說(shuō)明這是viewController的屬性和方法了矢门,只需要在viewController里調(diào)用修改即可
- UIStatusBarStyle 和 prefersStatusBarHidden這兩個(gè)屬性是readonly readonly readonly也就是說(shuō)我們?nèi)绻{(diào)用下面 肯定是報(bào)錯(cuò)的:
//這是錯(cuò)誤的寫法
self.preferredStatusBarStyle = UIStatusBarStyleDefault;和
self.prefersStatusBarHidden = YES;
- 正確的打開(kāi)方式在viewController重寫我們還沒(méi)用的新的方法
//這是正確的
- (BOOL)prefersStatusBarHidden{
return YES;
}
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleDefault;
}
9.UITextField(好像作用并不大)
- 在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType類型,它是一個(gè)枚舉,作用是可以指定輸入框的類型,以便系統(tǒng)可以分析出用戶的語(yǔ)義.是電話類型就建議一些電話,是地址類型就建議一些地址.可以在#import <UIKit/UITextInputTraits.h>文件中,查看textContentType字段,有以下可以選擇的類型:
UIKIT_EXTERN UITextContentType const UITextContentTypeName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNamePrefix NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeGivenName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeMiddleName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeFamilyName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNameSuffix NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNickname NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeJobTitle NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeOrganizationName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeLocation NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeFullStreetAddress NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine1 NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine2 NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCity NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressState NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCityAndState NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeSublocality NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeCountryName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypePostalCode NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeTelephoneNumber NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeEmailAddress NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeURL NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeCreditCardNumber NS_AVAILABLE_IOS(10_0);
10.UICollectionViewCell的的優(yōu)化
在iOS 10 之前,UICollectionView上面如果有大量cell,當(dāng)用戶活動(dòng)很快的時(shí)候,整個(gè)UICollectionView的卡頓會(huì)很明顯,為什么會(huì)造成這樣的問(wèn)題,這里涉及到了iOS 系統(tǒng)的重用機(jī)制,當(dāng)cell準(zhǔn)備加載進(jìn)屏幕的時(shí)候,整個(gè)cell都已經(jīng)加載完成,等待在屏幕外面了,也就是整整一行cell都已經(jīng)加載完畢,這就是造成卡頓的主要原因,專業(yè)術(shù)語(yǔ)叫做:掉幀.
要想讓用戶感覺(jué)不到卡頓,我們的app必須幀率達(dá)到60幀/秒,也就是說(shuō)每幀16毫秒要刷新一次.-
iOS 10 之前UICollectionViewCell的生命周期是這樣的:
用戶滑動(dòng)屏幕,屏幕外有一個(gè)cell準(zhǔn)備加載進(jìn)來(lái),把cell從reusr隊(duì)列拿出來(lái),然后調(diào)用prepareForReuse方法,在這個(gè)方法里面,可以重置cell的狀態(tài),加載新的數(shù)據(jù);
繼續(xù)滑動(dòng),就會(huì)調(diào)用cellForItemAtIndexPath方法,在這個(gè)方法里面給cell賦值模型,然后返回給系統(tǒng);
當(dāng)cell馬上進(jìn)去屏幕的時(shí)候,就會(huì)調(diào)用willDisplayCell方法,在這個(gè)方法里面我們還可以修改cell,為進(jìn)入屏幕做最后的準(zhǔn)備工作;
執(zhí)行完willDisplayCell方法后,cell就進(jìn)去屏幕了.當(dāng)cell完全離開(kāi)屏幕以后,會(huì)調(diào)用didEndDisplayingCell方法.
-
iOS 10 UICollectionViewCell的生命周期是這樣的:
用戶滑動(dòng)屏幕,屏幕外有一個(gè)cell準(zhǔn)備加載進(jìn)來(lái),把cell從reusr隊(duì)列拿出來(lái),然后調(diào)用prepareForReuse方法,在這里當(dāng)cell還沒(méi)有進(jìn)去屏幕的時(shí)候,就已經(jīng)提前調(diào)用這個(gè)方法了,對(duì)比之前的區(qū)別是之前是cell的上邊緣馬上進(jìn)去屏幕的時(shí)候就會(huì)調(diào)用該方法,而iOS 10 提前到cell還在屏幕外面的時(shí)候就調(diào)用;
在cellForItemAtIndexPath中創(chuàng)建cell盆色,填充數(shù)據(jù),刷新?tīng)顟B(tài)等操作,相比于之前也提前了;
用戶繼續(xù)滑動(dòng)的話,當(dāng)cell馬上就需要顯示的時(shí)候我們?cè)僬{(diào)用willDisplayCell方法,原則就是:何時(shí)需要顯示,何時(shí)再去調(diào)用willDisplayCell方法;
當(dāng)cell完全離開(kāi)屏幕以后,會(huì)調(diào)用didEndDisplayingCell方法,跟之前一樣,cell會(huì)進(jìn)入重用隊(duì)列.
在iOS 10 之前,cell只能從重用隊(duì)列里面取出,再走一遍生命周期,并調(diào)用cellForItemAtIndexPath創(chuàng)建或者生成一個(gè)cell.
在iOS 10 中,系統(tǒng)會(huì)cell保存一段時(shí)間,也就是說(shuō)當(dāng)用戶把cell滑出屏幕以后,如果又滑動(dòng)回來(lái),cell不用再走一遍生命周期了,只需要調(diào)用willDisplayCell方法就可以重新出現(xiàn)在屏幕中了.
iOS 10 中,系統(tǒng)是一個(gè)一個(gè)加載cell的,二以前是一行一行加載的,這樣就可以提升很多性能;
-
iOS 10 新增加的Pre-Fetching預(yù)加載
這個(gè)是為了降低UICollectionViewCell在加載的時(shí)候所花費(fèi)的時(shí)間,在 iOS 10 中,除了數(shù)據(jù)源協(xié)議和代理協(xié)議外,新增加了一個(gè)UICollectionViewDataSourcePrefetching協(xié)議,這個(gè)協(xié)議里面定義了兩個(gè)方法:
- (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0);
- (void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0);
- 在ColletionView prefetchItemsAt indexPaths這個(gè)方法是異步預(yù)加載數(shù)據(jù)的,當(dāng)中的indexPaths數(shù)組是有序的,就是item接收數(shù)據(jù)的順序;
CollectionView cancelPrefetcingForItemsAt indexPaths這個(gè)方法是可選的,可以用來(lái)處理在滑動(dòng)中取消或者降低提前加載數(shù)據(jù)的優(yōu)先級(jí).
注意:這個(gè)協(xié)議并不能代替之前讀取數(shù)據(jù)的方法,僅僅是輔助加載數(shù)據(jù).
Pre-Fetching預(yù)加載對(duì)UITableViewCell同樣適用.
11.UIRefreshControl
- 在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脫離了UITableViewController.現(xiàn)在RefreshControl是UIScrollView的一個(gè)屬性.
使用方法:
//創(chuàng)建
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor redColor];
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"正在刷新"];
[refreshControl addTarget:self action:@selector(loadData) forControlEvents:UIControlEventValueChanged];
//開(kāi)始和停止刷新
[refreshControl beginRefreshing];
[refreshControl endRefreshing];
- 也可以進(jìn)去頭文件查看
#import<UIRefershControll.h>
- (instancetype)init;
@property (nonatomic, readonly, getter=isRefreshing) BOOL refreshing;
@property (null_resettable, nonatomic, strong) UIColor *tintColor;
@property (nullable, nonatomic, strong) NSAttributedString *attributedTitle UI_APPEARANCE_SELECTOR;
// May be used to indicate to the refreshControl that an external event has initiated the refresh action
- (void)beginRefreshing NS_AVAILABLE_IOS(6_0);
// Must be explicitly called when the refreshing has completed
- (void)endRefreshing NS_AVAILABLE_IOS(6_0);
12.Xcode8 debug輸出不相關(guān)信息
升級(jí)到Xcode8時(shí)祟剔,我們?cè)赿ebug的時(shí)候控制臺(tái)輸出了很長(zhǎng)很長(zhǎng)的信息隔躲,看著比較煩,怎么屏蔽呢峡扩?
需要edit Scheme添加一個(gè)鍵值對(duì)就ok了。
添加 key:OS_ACTIVITY_MODE
value:disable
13.UserNotifications(用戶通知)
- iOS 10 中將通知相關(guān)的 API 都統(tǒng)一了,蘋果對(duì)這是做了重大改進(jìn)障本,變的非常易用教届。
iOS 9 以前的通知
在調(diào)用方法時(shí),有些方法讓人很難區(qū)分驾霜,容易寫錯(cuò)方法案训,這讓開(kāi)發(fā)者有時(shí)候很苦惱。
應(yīng)用在運(yùn)行時(shí)和非運(yùn)行時(shí)捕獲通知的路徑還不一致粪糙。
應(yīng)用在前臺(tái)時(shí)强霎,是無(wú)法直接顯示遠(yuǎn)程通知,還需要進(jìn)一步處理蓉冈。
已經(jīng)發(fā)出的通知是不能更新的城舞,內(nèi)容發(fā)出時(shí)是不能改變的,并且只有簡(jiǎn)單文本展示方式寞酿,擴(kuò)展性根本不是很好家夺。
iOS 10 開(kāi)始的通知
所有相關(guān)通知被統(tǒng)一到了UserNotifications.framework框架中。
增加了撤銷伐弹、更新拉馋、中途還可以修改通知的內(nèi)容。
通知不在是簡(jiǎn)單的文本了惨好,可以加入視頻煌茴、圖片,自定義通知的展示等等日川。
iOS 10相對(duì)之前的通知來(lái)說(shuō)更加好用易于管理蔓腐,并且進(jìn)行了大規(guī)模優(yōu)化,對(duì)于開(kāi)發(fā)者來(lái)說(shuō)是一件好事龄句。
iOS 10開(kāi)始對(duì)于權(quán)限問(wèn)題進(jìn)行了優(yōu)化合住,申請(qǐng)權(quán)限就比較簡(jiǎn)單了(本地與遠(yuǎn)程通知集成在一個(gè)方法中)绰精。
iOS 10 通知學(xué)習(xí)相關(guān)資料:
后面對(duì)UserNotifications單獨(dú)發(fā)表文章學(xué)習(xí)相關(guān)的知識(shí)
參考資料: