iOS 10 適配知識(shí)點(diǎn)總結(jié)

背景

剛剛過(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):

iOS 10.png

1.證書問(wèn)題

  • 打開(kāi)xcode8.0時(shí)編譯運(yùn)行時(shí)出現(xiàn)下面問(wèn)題:

39B1F3AE-530A-46B7-BE6E-379A0AA6B4DE.png

這個(gè)問(wèn)題剛開(kāi)始估計(jì)大家都會(huì)碰到也是第一個(gè)要解決的問(wèn)題
這個(gè)問(wèn)題就是一個(gè)證書的設(shè)置問(wèn)題,下面看兩張圖
正常我們會(huì)在BuildeSettings中設(shè)置證書:
A6682834-E135-4D55-9636-DC5E0962AF05.png

但是在xcode8.0中我們看到下面的新特性:
06300540-83C7-44F4-9069-F198599F0086.png

相信大家都能看到在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è)置界面了
A55064BB-2BD5-4DEA-A733-862761D76F5B.png
88F76B47-A82A-4426-A5AE-8EB42CAB0DEA.png

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ū)別看下圖:

06E01411-216F-4BE6-B36D-27FE3FEA790D.png
F354DBB8-6192-403B-9817-024257DE1310.png
  • 可以看出下面的顏色(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也不能使用了移国,下面是作者的感謝
    9A4F4CA5-47C7-4301-9BE8-599DCA1BD5B4.png

    看來(lái)大神都是謙虛的爸ù瘛(啥時(shí)候能成為大神。我還是洗洗睡吧迹缀,夢(mèng)里啥都有^_^
  • 上面也提到了我們可以繼續(xù)使用注釋使碾,快捷鍵(? Option + ? Command + /

8.UIStatusBar的問(wèn)題

  • 在iOS10中,如果還使用以前設(shè)置UIStatusBar類型或者控制隱藏還是顯示的方法,會(huì)報(bào)警告,方法過(guò)期,如下圖:
21A56CDA-7A82-433C-B446-24C428087D1F.png

警告中提到從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的生命周期是這樣的:

    1. 用戶滑動(dòng)屏幕,屏幕外有一個(gè)cell準(zhǔn)備加載進(jìn)來(lái),把cell從reusr隊(duì)列拿出來(lái),然后調(diào)用prepareForReuse方法,在這個(gè)方法里面,可以重置cell的狀態(tài),加載新的數(shù)據(jù);

    2. 繼續(xù)滑動(dòng),就會(huì)調(diào)用cellForItemAtIndexPath方法,在這個(gè)方法里面給cell賦值模型,然后返回給系統(tǒng);

    3. 當(dāng)cell馬上進(jìn)去屏幕的時(shí)候,就會(huì)調(diào)用willDisplayCell方法,在這個(gè)方法里面我們還可以修改cell,為進(jìn)入屏幕做最后的準(zhǔn)備工作;

    4. 執(zhí)行完willDisplayCell方法后,cell就進(jìn)去屏幕了.當(dāng)cell完全離開(kāi)屏幕以后,會(huì)調(diào)用didEndDisplayingCell方法.

  • iOS 10 UICollectionViewCell的生命周期是這樣的:

    1. 用戶滑動(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)用;

    2. 在cellForItemAtIndexPath中創(chuàng)建cell盆色,填充數(shù)據(jù),刷新?tīng)顟B(tài)等操作,相比于之前也提前了;

    3. 用戶繼續(xù)滑動(dòng)的話,當(dāng)cell馬上就需要顯示的時(shí)候我們?cè)僬{(diào)用willDisplayCell方法,原則就是:何時(shí)需要顯示,何時(shí)再去調(diào)用willDisplayCell方法;

    4. 當(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);

C5934374-2403-4C9E-9BBC-BB89B9A77420.png

12.Xcode8 debug輸出不相關(guān)信息

升級(jí)到Xcode8時(shí)祟剔,我們?cè)赿ebug的時(shí)候控制臺(tái)輸出了很長(zhǎng)很長(zhǎng)的信息隔躲,看著比較煩,怎么屏蔽呢峡扩?

需要edit Scheme添加一個(gè)鍵值對(duì)就ok了。

打開(kāi)Scheme方式1.png
打開(kāi)Scheme方式1.png
添加鍵值對(duì).png

添加 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)資料:

  1. UserNotifications: 蘋果官方文檔
  1. 活久見(jiàn)的重構(gòu) - iOS 10 UserNotifications 框架解析
  2. WWDC2016 Session筆記 - iOS 10 推送Notification新特性

后面對(duì)UserNotifications單獨(dú)發(fā)表文章學(xué)習(xí)相關(guān)的知識(shí)

參考資料:

  1. http://blog.csdn.net/jiang314/article/details/52502450
  2. http://www.reibang.com/p/90d5323cf510
  3. 個(gè)人博客 http://dely.vip
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市透葛,隨后出現(xiàn)的幾起案子笨使,更是在濱河造成了極大的恐慌,老刑警劉巖僚害,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硫椰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萨蚕,警方通過(guò)查閱死者的電腦和手機(jī)靶草,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岳遥,“玉大人奕翔,你說(shuō)我怎么就攤上這事『迫兀” “怎么了派继?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捻艳。 經(jīng)常有香客問(wèn)我驾窟,道長(zhǎng),這世上最難降的妖魔是什么认轨? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任绅络,我火速辦了婚禮,結(jié)果婚禮上嘁字,老公的妹妹穿的比我還像新娘恩急。我一直安慰自己,他們只是感情好纪蜒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布假栓。 她就那樣靜靜地躺著,像睡著了一般霍掺。 火紅的嫁衣襯著肌膚如雪匾荆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天杆烁,我揣著相機(jī)與錄音牙丽,去河邊找鬼。 笑死兔魂,一個(gè)胖子當(dāng)著我的面吹牛烤芦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播析校,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼构罗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铜涉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起遂唧,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芙代,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后盖彭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纹烹,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年召边,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铺呵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隧熙,死狀恐怖片挂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贞盯,我是刑警寧澤音念,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站邻悬,受9級(jí)特大地震影響症昏,放射性物質(zhì)發(fā)生泄漏随闽。R本人自食惡果不足惜父丰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掘宪。 院中可真熱鬧蛾扇,春花似錦、人聲如沸魏滚。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鼠次。三九已至更哄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腥寇,已是汗流浹背成翩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赦役,地道東北人麻敌。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掂摔,于是被迫代替她去往敵國(guó)和親术羔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赢赊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,391評(píng)論 0 12
  • 一、證書管理用Xcode8打開(kāi)工程后级历,比較明顯的就是下圖了释移,這個(gè)是蘋果的新特性,可以幫助我們自動(dòng)管理證書鱼喉。建議大家...
    seventhboy閱讀 1,504評(píng)論 0 2
  • 隨著iOS10發(fā)布的臨近,大家的App都需要適配iOS10,下面是我總結(jié)的一些關(guān)于iOS10適配方面的問(wèn)題,如果有...
    心淡然如水閱讀 483評(píng)論 0 0
  • 2016-09-20 iOS開(kāi)發(fā) 文/Eternaldream(授權(quán)) 原文鏈接:http://www.jians...
    iOS暮光閱讀 2,036評(píng)論 2 14
  • 思想和語(yǔ)言之間存在一些奇特的差異秀鞭,一切并不是維特根斯坦提出的那般易于表清,哲學(xué)也不會(huì)是語(yǔ)言上的誤解扛禽。一個(gè)人如果僅僅...
    可止閱讀 585評(píng)論 0 0