座標:表示屏幕物理尺寸大小,座標變大了,表示機器屏幕尺寸變大了;html
像素:表示屏幕圖片的大小,跟座標之間有個對應關係,好比1:1或1:2等;ios
ppi:表明屏幕物理大小到圖片大小的比例值,若是ppi不變,則座標和像素的比例不會變;git
引用一段文字說的很好: github
「不是現有的屏幕物理分辨率明顯超過了 @2x 但還達不到 @3x 的水平麼?那咱們歪打正着一個知足 @3x 的屏幕總能夠吧?
對的,歪打正着。
程序在 iPhone 6 Plus 上運行的時候,iOS 會騙它說,你運行在一個超大的 @3x Retina 顯示屏上,物理分辨率高達 1242 x 2208,邏輯分辨率是 414 x 736,二者都比 iPhone 6 要大。而後做爲設計師和開發人員,也跟着一塊兒歪打正着。設計師畫圖的時候要把屏幕當成 1242 x 2208 來畫圖(並且要提供@3x 的高清圖),開發人員也按照 414 x 736 的邏輯分辨率來寫程序。
但借來的總要還的。等我們歪歪結束了之後,iOS 拿到這個假大的 UI 繪製結果,實時地再縮小到實際的 1080 x 1920 分辨率(系統經過某種算法)。因而,用戶在 iPhone 6 Plus 的屏幕上看到的永遠是被縮小了的圖像:算法
這麼作使得設計和開發的過程大大簡化,且最後的實際縮放係數 @2.62x 很是接近理想的 @2.46x,使得一樣的素材在真機上看起來尺寸也很是合理。xcode
在新特性界面中,根據:[UIScreen mainScreen].bounds.size.height.來判斷用戶的屏幕長度,來判斷時3.5寸,4 寸,4.7寸,5.5寸,以此來設置新特性中圖片選用哪套。安全
經常使用寫法:網絡
#define kScreenWidth [UIScreen mainScreen].bounds.size.widthapp
CGFloat btnW =kScreenWidth * 1/4;less
對於iOS,Bitcode是可選的;對於watchOS,Bitcode是必須的;而Mac OS是不支持Bitcode。
若是咱們開啓了Bitcode,在提交程序到AppStore時,會看到有Bitcode的選項
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
寫在
-layoutSubviews
中:
-(void)layoutSubviews{
[super layoutSubviews]; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; }
現象: [tableView reloadData]
無效,有一行 cell 明明改變了可是刷新不出來。
感受多是這個方法和某種新加的特性衝突了,猜想多是 reloadData
的操做被推遲到下一個 RunLoop
執行最終失效。
解決的方法是,註釋 [tableView reloadData]
,改用局部刷新:
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
這兩個推測均屬 Xcode7 的bug,未來 Apple 確定會修復。
【項目中關於iOS9的適配暫時遇到這麼多,若是你還想了解更多詳情,請參照以下教程: iOS9適配系列教程】。/** 消息推送 **/ - (void) msgPush { //推送的形式:標記,聲音,提示 if (IS_IOS8) { //1.建立消息上面要添加的動做(按鈕的形式顯示出來) UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init]; action.identifier = @"action";//按鈕的標示 action.title=@"Accept";//按鈕的標題 action.activationMode = UIUserNotificationActivationModeForeground;//當點擊的時候啓動程序 // action.authenticationRequired = YES; // action.destructive = YES; UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init]; action2.identifier = @"action2"; action2.title=@"Reject"; action2.activationMode = UIUserNotificationActivationModeBackground;//當點擊的時候不啓動程序,在後臺處理 action.authenticationRequired = YES;//須要解鎖才能處理,若是action.activationMode = UIUserNotificationActivationModeForeground;則這個屬性被忽略; action.destructive = YES; //2.建立動做(按鈕)的類別集合 UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init]; categorys.identifier = @"alert";//這組動做的惟一標示,推送通知的時候也是根據這個來區分 [categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)]; //3.建立UIUserNotificationSettings,並設置消息的顯示類類型 UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil]]; [[UIApplication sharedApplication] registerUserNotificationSettings:notiSettings]; }else{ [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; } }