代碼注釋不能用的解決辦法
這個是因為蘋果解決xcode ghost,把插件屏蔽了。
解決方法
打開終端,命令運行: sudo /usr/libexec/xpccachectl
然後必須重啟電腦後生效
注意:Xcode8內置了開啟注釋的功能,位置在這裡
屏蔽雜亂無章的bug
更新Xcode8之後,新建立工程,都會打印一堆莫名其妙看不懂的Log.
如這些
subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1,
屏蔽的方法如下:
Xcode8裡邊 Edit Scheme-> Run -> Arguments, 在Environment Variables裡邊添加字典:
(name)OS_ACTIVITY_MODE = (value:)Disable
在設置log選項的時候,發現可以通過在Arguments中設置參數,打印出App加載的時長,包括整體加載時長,動態庫加載時長等。
在Environment Variables中添加DYLD_PRINT_STATISTICS字段,並設置為YES,在控制台就會打印加載時長。
考慮到添加上述內容在Xcode8後,真機調試可能出現異常,大家可以自定義一個宏定義,來做日志輸出。
#ifdef DEBUG
#define DDLOG(…) printf(” %s\n”,[[NSString stringWithFormat:VA_ARGS]UTF8String]);
#define DDLOG_CURRENT_METHOD NSLog(@”%@-%@”, NSStringFromClass([self class]), NSStringFromSelector(_cmd))
#else
#define DDLOG(…) ;
#define DDLOG_CURRENT_METHOD ;
#endif
字體適配的問題
ios 9 之前的lab 字體可以顯示全,但是到了ios10 發覺字體顯示不全了.得適配啊.app 會跟隨手機系統字體大小而改變了.
簡單粗暴地方法就是不讓他跟著手機系統的字體改變而改變.
myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline];
// UIFont 的preferredFontForTextStyle: 意思是指定一個樣式,並讓字體大小符合用戶設定的字體大小。
/*
Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed.
For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle.
*/
//是否更新字體的變化
label.adjustsFontForContentSizeCategory = YES;
字體變大,原有frame需要適配
發現程序內Label標簽原來2個字的寬度是24,現在2個字需要27的寬度來顯示了。。
iOS 10 開始的通知
1.所有相關通知被統一到了UserNotifications.framework框架中。
2.增加了撤銷、更新、中途還可以修改通知的內容。
3.通知不在是簡單的文本了,可以加入視頻、圖片,自定義通知的展示等等。
4.iOS 10相對之前的通知來說更加好用易於管理,並且進行了大規模優化,對於開發者來說是一件好事。
5.iOS 10開始對於權限問題進行了優化,申請權限就比較簡單了(本地與遠程通知集成在一個方法中)。
所有的推送平台,不管是極光還是什麼的,要想收到推送,這個是必須打開的
(void)userNotificationCenter:(UNUserNotificationCenter )center willPresentNotification:(UNNotification )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
//應用在前台收到通知 NSLog(@”========%@”, notification);
}
推送的代理iOS10收到通知不再是在[application: didReceiveRemoteNotification:]方法去處理, iOS10推出新的代理方法,接收和處理各類通知(本地或者遠程)
(void)userNotificationCenter:(UNUserNotificationCenter )center didReceiveNotificationResponse:(UNNotificationResponse )response withCompletionHandler:(void (^)())completionHandler {
//點擊通知進入應用 NSLog(@”response:%@”, response);
}
xcode8的注釋快捷鍵注釋不能用了, command+/ 不行了
解決辦法:
因為蘋果解決xcode ghost。把插件屏蔽了。解決方法
命令運行: sudo /usr/libexec/xpccachectl
然後必須重啟電腦後生效
顏色問題, iOS 10 蘋果官方建議我們使用sRGB,因為它性能更好,色彩更豐富。
UIColor類中新增了兩個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);
判斷版本問題
判斷系統版本是我們經常用到的,尤其是現在大家都有可能需要適配iOS 10,那麼問題就出現了,如下圖:
我們得到了答案是:
//值為 1
[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue]
//值為10.000000
[[UIDevice currentDevice] systemVersion].floatValue,
//值為10.0
[[UIDevice currentDevice] systemVersion]
所以說判斷系統方法最好還是用後面的兩種方法,哦~我忘記說了[[UIDevice currentDevice] systemVersion].floatValue這個方法也是不靠譜的,好像在8.3版本輸出的值是8.2,記不清楚了反正是不靠譜的,所以建議大家用[[UIDevice currentDevice] systemVersion]這個方法!
Swift判斷如下:
if #available(iOS 10.0, *) {
print(“iOS 10.0”); // iOS 10.0啊
} else{ };
https的問題
iOS 9中默認非HTTS的網絡是被禁止的,當然我們也可以把NSAllowsArbitraryLoads設置為YES禁用ATS。不過iOS 10從2017年1月1日起蘋果不允許我們通過這個方法跳過ATS,也就是說強制我們用HTTPS,如果不這樣的話提交App可能會被拒絕。但是我們可以通過NSExceptionDomains來針對特定的域名開放HTTP可以容易通過審核。
隱私權限
iOS 10 開始對隱私權限更加嚴格,如果你不設置就會直接崩潰,現在很多遇到崩潰問題了,一般解決辦法都是在info.plist文件添加對應的Key-Value就可以了。
NSPhotoLibraryUsageDescription
App需要您的同意,才能訪問相冊
NSCameraUsageDescription
App需要您的同意,才能訪問相機
NSMicrophoneUsageDescription
App需要您的同意,才能訪問麥克風
NSLocationUsageDescription
App需要您的同意,才能訪問位置
NSLocationWhenInUseUsageDescription
App需要您的同意,才能在使用期間訪問位置
NSLocationAlwaysUsageDescription
App需要您的同意,才能始終訪問位置
NSCalendarsUsageDescription
App需要您的同意,才能訪問日歷
NSRemindersUsageDescription
App需要您的同意,才能訪問提醒事項
NSMotionUsageDescription App需要您的同意,才能訪問運動與健身
NSHealthUpdateUsageDescription
App需要您的同意,才能訪問健康更新
NSHealthShareUsageDescription
App需要您的同意,才能訪問健康分享
NSBluetoothPeripheralUsageDescription
App需要您的同意,才能訪問藍牙
NSAppleMusicUsageDescription
App需要您的同意,才能訪問媒體資料庫
權限以及相關設置
iOS10調用相冊會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.
大體意思就是這個App缺少一個獲取私有(敏感)數據的權限描述,需要我們在info.plist文件中必須含有一個名字叫做NSPhotoLibraryUsageDescription的值來解釋為什麼應用需要使用這個數據,沒錯,獲取相冊資源的鍵值就是NSPhotoLibraryUsageDescription
去plist文件中添加了下面的鍵值:
再點擊獲取圖片資源,就彈出了一個獲取權限的問候,不會發生崩潰了:
Privacy - Microphone Usage Description //麥克風權限
Privacy - Contacts Usage Description //通訊錄權限
Privacy - Camera Usage Description //攝像頭權限
Privacy - NSSiriUsageDescription //Siri的權限
Privacy - Bluetooth Peripheral Usage Description //藍牙
Privacy - Reminders Usage Description //提醒事項
Privacy - Motion Usage Description //運動與健康
Privacy - Media Libaray Usage Description //媒體資源庫
Privacy - Calendars Usage Description //日歷
xib設定好固定尺寸在代碼中獲取控件尺寸都變成(0,0,1000,1000)
UIView中要從- (void)updateConstraints或者- (void)drawRect:(CGRect)rect獲取控件尺寸。
(void)updateConstraints
{
[super updateConstraints];
}
(void)drawRect:(CGRect)rect
{
[super drawRect:rect];
}
UIViewController中要從- (void)viewDidLayoutSubviews獲取控件尺寸。
(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
}
Xcode 8使用Xib awakeFromNib的警告問題
在Xcode 8之前我們使用Xib初始化- (void)awakeFromNib {}都是這麼寫也沒什麼問題,但是在Xcode 8會有如下警告:
如果不喜歡這個警告的話,應該明確的加上[super awakeFromNib];我們來看看官方說明:
隱藏狀態欄的功能壞掉:
升級到 iOS 10.0後,在查看全屏圖片的時候,需要在 Present 之前給要 present 的 view controller 設置 modalPresentationCapturesStatusBarAppearance = true。然後就好啦
TestViewController *testVC = [[TestViewController alloc] init];
testVC.modalPresentationCapturesStatusBarAppearance = true;
[self presentViewController:testVC animated:YES completion:nil];
//iOS 10 狀態欄的設置
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
************iOS 10 UITextContentType
// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.
@property(nonatomic,copy) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil
在iOS 10 UITextField添加了textContentType枚舉,指示文本輸入區域所期望的語義意義。
使用此屬性可以給鍵盤和系統信息,關於用戶輸入的內容的預期的語義意義。例如,您可以指定一個文本字段,用戶填寫收到一封電子郵件確認 uitextcontenttypeemailaddress。當您提供有關您期望用戶在文本輸入區域中輸入的內容的信息時,系統可以在某些情況下自動選 擇適當的鍵盤,並提高鍵盤修正和主動與其他文本輸入機會的整合。
UIScrollView自帶刷新功能
iOS 10 以後只要是繼承UIScrollView那麼就支持刷新功能:
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;
ImagePickerController.cameraViewTransform問題
(本條更新於:2016-09-21) 很多人反映自定義相機出現了問題,cameraViewTransform不能用了,其實網上關於這個的資料不是很多,在這裡提供參考辦法如下:
通過監聽AVCaptureSessionDidStartRunningNotification來解決
//#import