iOS9 適配

iOS適配的相關內容的整理

       以前iOS開發者一直很慶幸本身不用像安卓開發者那樣適配各類不一樣類型的機型,但現在隨着iPhone各類機型的改變,適配也成了咱們開發中必須會的內容了。首先咱們來了解一下對於不一樣蘋果設備,各個參數的列表:

       各機型參數對比

  

1、機型的適配;

1.機型的變化:

  座標:表示屏幕物理尺寸大小,座標變大了,表示機器屏幕尺寸變大了;html

  像素:表示屏幕圖片的大小,跟座標之間有個對應關係,好比1:1或1:2等;ios

  ppi:表明屏幕物理大小到圖片大小的比例值,若是ppi不變,則座標和像素的比例不會變;git

iPhone 4 之前

iPhone、iPhone3/3G機型未採用retina,座標是320 x 480,屏幕像素320 x 480 ,他們一一對應,1:1關係。即一個座標對應1個像素。

iPhone4/4s

機器採用了retina屏幕,座標是320 x 480,屏幕像素640 x 960,他們之間是1:2關係。即一個座標對應2個像素。
 

iPhone 5/5s/5c

機器採用了retina屏幕,座標是320 x 568,屏幕像素640 x 1136,他們之間關係式1:2關係。即一個座標對應2個像素。

iPhone 6

機器採用了retina屏幕,座標是375, 667,屏幕像素750 x 1334,他們之間關係式1:2關係。即一個座標對應2個像素.
 

iPhone 6 plus

機器採用了retina屏幕,座標是414, 736,屏幕像素1080 x 1920,他們之間關係式1:2.6關係。即一個座標對應2.6個像素.
 

2.適配方法:

2.1.1圖片適配

  • iPhone 4s以後,不一樣機型,屏幕大小座標不變,跟實際圖片大小比例不是1:1就是1:2關係。由於座標不變,因此在開發中可使用絕對定位,肯定每一個視圖位置,同時提供倆套圖片,~.png和~@2x.png,系統根據機器的分辨率自動決定使用哪張圖片。
  • iPhone 5/5s/5c以後,由於屏幕大小座標已變,高度增長568 - 480 = 88個點,再使用絕對定位的方式,會致使程序高度不夠,若是程序未作適配,系統會將多出來的88個點將會將會被自動均分爲上下兩部分,使得上下出現黑邊。對應不一樣機型,屏幕座標大小改變了,不能再絕對定位了,爲了解決這個問題,ios出現了一種新技術:AutoLayout。AutoLayout能夠解決不一樣機型,屏幕大小的變化,至於圖片的適配,由於5/5s/5c,座標:像素 = 1:2,因此直接使用@2x.png圖片就行。                                                                      至於@2x圖片大小,是按照640 x 960 仍是 640 x 1136 的大小,一個是拉伸效果,一個是壓縮效果,由於比例差很少,推薦使用大圖的。
  • iPhone 6以後,由於屏幕大小座標已變,寬、高都增大,可是寬、高比例不變,相似以前的處理方式,使用AutoLayout自動適配,座標:像素 = 1:2,使用@2x.png圖片。
    綜合以前的,@2x圖片能夠按照750 x 1334規格來
  • iPhone 6 plus,相似以前使用AutoLayout,在使用圖片的時候,由於 座標:像素 = 1:2.6,理論上使用@2.6x.png圖片便可,可是這不是整數,實際使用很不方便,而@2x 和 @3x 都不太行得通,怎麼辦?

     引用一段文字說的很好:  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

2.1.2代碼適配

(1)根據屏幕的寬和高寫相關的frame

        在新特性界面中,根據:[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

 
(2)存代碼實現AutoLayout,通常使用第三方封裝好的 Masonry
         
 
(3)StoryBoard的AutoLayout,這個我在項目中使用不是太多,可是收集一下網址,你們能夠參照學習哦!
 

機型適配總結:

  • 不一樣機型適配可當作兩部分,一是屏幕大小適配(座標),一是像素適配;前者根據不一樣的機型大小,視圖大小自動適應(AutoLayout);後者根據機型的分辨率和座標比率,提供合適@xx圖片;
  • 目前4s、5/5s/5c、6的適配,使用圖片部分,都是使用@2x的圖片,在不一樣的機器上確定會有必定的拉伸、縮小,目前沒看到什麼好的解決方案,推薦圖片按大圖標準作;
  • 趨勢:機器屏幕的大小可能會愈來愈多,絕對定位的方式確定不行,使用AutoLayout,自動適配屏幕大小,相似網頁的思想來設計界面;
  • 趨勢:xcode 6中已經可使用矢量圖了,可使用矢量圖,避免各類規格圖片;
  • 對於設計師:
    (1)非矢量素材,就能夠作尺寸最大的,以後再進行縮小。好比你須要兼容3x的屏幕,就直接作最高那種圖片。由於以後幾種機型長寬比都是9:16,能夠直接拉伸。
    (2)已有非矢量素材,直接拉伸放大到@3x。
    (3)而當使用Flash之類的矢量工具來作素材的時候,應該直接作點那個尺寸。好比44 x 66個點的按鈕。就創建一個44 x 66的場景。以後再導出成2倍圖,3倍圖,由於矢量放大不失真。不要創建一個3x的場景,導出成大圖片,再進行縮小,這樣就容易失真。

2、系統適配;

1.iOS9網絡適配,改成更爲安全的HTTPS

在Info.plist的source code中添加一段代碼便可:
[objc]  view plain copy
  1. <key>NSAppTransportSecurity</key>  
  2. <dict>  
  3.     <key>NSAllowsArbitraryLoads</key>  
  4.     <true/>  
  5. </dict>  


 

2.Bitcode

Bitcode支持watchOS,若是在程序中Bitcode開關是打開的狀態,那麼第三方庫必須支持Bitcode,可是好多第三方庫不支持Bitcode,所以在Xcode7會報以下錯誤:
 
 
UMengFeedback_SDK_2.1/libUMFeedback.a(UMChatTableViewCell.o)'doesnot contain bitcode. You must rebuild it with bitcode enabled (XcodesettingENABLE_BITCODE), obtain an updated library from the vendor, or disablebitcodefor this target. for architecture arm64
 

解決方案有兩種:

第一種:使第三方庫支持Bitcode(固然這個咱們不容易控制,因此這個方案通常不採用);

第二種:關閉taget的Bitcode選項

實際上,在Xcode 7中,咱們新建一個iOS程序時,Bitcode選項默認是設置爲YES的。咱們能夠在」BuildSettings」->」Enable Bitcode」選項中看到這個設置。不過,咱們如今須要考慮的是三個平臺:iOS,Mac OS,watchOS;

對於iOS,Bitcode是可選的;對於watchOS,Bitcode是必須的;而Mac OS是不支持Bitcode。

若是咱們開啓了Bitcode,在提交程序到AppStore時,會看到有Bitcode的選項

3.iOS9 URL Scheme適配引入白名單

通常應用中都會集成第三方分享,登錄,以及支付,因此須要將三方的相關內容加入到相關的白名單中,能夠直接修改plist文件中的代碼:
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testA</string>
        </array>
    </dict>
</array>
也能夠直接經過以下方式添加:

 
 

4.代碼建立UITableView沒法隱藏cell的分割線;以及reloadData刷新失效;

解決方法是將設置分割線隱藏的方法  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適配系列教程】。
 
說完iOS9的適配咱們來了解一下iOS的一些適配的相關內容(iOS8的適配沒有像iOS9那樣火爆,就如網絡請求同樣,若是你不適配iOS9是請求不到數據的,能夠說咱們是被逼着往前跑的),項目中涉及到的iOS8的適配有以下內容:
/**
    消息推送
 **/
- (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];
    }
    
}
相關文章
相關標籤/搜索