1. 程式人生 > >iOS橫豎屏旋轉及其基本適配方法

iOS橫豎屏旋轉及其基本適配方法

螢幕旋轉示例.jpeg

前段時間抽空總結了一下iOS視訊播放的基本用法,發現這其中還有一個我們無法繞過的問題,那就是播放介面的旋轉與適配。的確,視訊播放與遊戲型別的App經常會遇到這個的問題。由於至今接手的專案中不常涉及這塊知識疏於總結,在搜尋了一些資料後也發現都很散亂,所以決定在這裡重新整理一下。

目錄

一、最讓人糾結的三種列舉
二、兩種螢幕旋轉的觸發方式
三、螢幕旋轉控制的優先順序
四、開啟螢幕旋轉的全域性許可權
五、開啟螢幕旋轉的區域性許可權(檢視控制器)
六、實現需求:專案主要介面豎屏,部分介面橫屏
七、預設橫屏無效的問題
八、關於旋轉後的適配問題
九、APP啟動即全屏

一、最讓人糾結的三種列舉

剛開始接觸螢幕旋轉這塊知識的時候,最讓人抓狂的也許就是三種相關的列舉型別了,它們就是UIDeviceOrientation、UIInterfaceOrientation、UIInterfaceOrientationMask。下面我們針對三種屬性進行解析:

1. 裝置方向:UIDeviceOrientation

UIDeviceOrientation是硬體裝置(iPhone、iPad等)本身的當前旋轉方向,裝置方向有7種(包括一種未知的情況),判斷裝置的方向是以home鍵的位置作為參照的,我們來看一下它們在原始碼中的定義如下:

//Portrait 表示縱向,Landscape 表示橫向。
typedef NS_ENUM(NSInteger, UIDeviceOrientation) { UIDeviceOrientationUnknown, // Device oriented vertically, home button on the top UIDeviceOrientationPortraitUpsideDown, // Device oriented horizontally, home button on the right UIDeviceOrientationLandscapeLeft, // Device oriented horizontally, home button on the left
UIDeviceOrientationLandscapeRight, // Device oriented flat, face up UIDeviceOrientationFaceUp, // Device oriented flat, face down UIDeviceOrientationFaceDown } __TVOS_PROHIBITED;

裝置方向只能取值,不能設定,
獲取裝置當前旋轉方向使用方法:[UIDevice currentDevice].orientation
監測裝置方向的變化,我們可以在Appdelegate檔案中使用通知如下:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDeviceOrientationDidChange)
                     name:UIDeviceOrientationDidChangeNotification
                                               object:nil];

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

 - (BOOL)onDeviceOrientationDidChange{
    //獲取當前裝置Device
    UIDevice *device = [UIDevice currentDevice] ;
    //識別當前裝置的旋轉方向
    switch (device.orientation) {
        case UIDeviceOrientationFaceUp:
            NSLog(@"螢幕幕朝上平躺");
            break;

        case UIDeviceOrientationFaceDown:
            NSLog(@"螢幕朝下平躺");
            break;

        case UIDeviceOrientationUnknown:
            //系統當前無法識別裝置朝向,可能是傾斜
            NSLog(@"未知方向");
            break;

        case UIDeviceOrientationLandscapeLeft:
            NSLog(@"螢幕向左橫置");
            break;

        case UIDeviceOrientationLandscapeRight:
            NSLog(@"螢幕向右橫置");
            break;

        case UIDeviceOrientationPortrait:
            NSLog(@"螢幕直立");
            break;

        case UIDeviceOrientationPortraitUpsideDown:
            NSLog(@"螢幕直立,上下顛倒");
            break;

        default:
            NSLog(@"無法識別");
            break;
    }
    return YES;
}

2.頁面方向:UIInterfaceOrientation

UIInterfaceOrientation程式介面的當前旋轉方向(可以設定),其原始碼的定義如下:

// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
// This is because rotating the device to the left requires rotating the content to the right.
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {

     UIInterfaceOrientationUnknown               = UIDeviceOrientationUnknown,

     UIInterfaceOrientationPortrait              = UIDeviceOrientationPortrait,

     UIInterfaceOrientationPortraitUpsideDown    = UIDeviceOrientationPortraitUpsideDown,

     UIInterfaceOrientationLandscapeLeft         = UIDeviceOrientationLandscapeRight,

     UIInterfaceOrientationLandscapeRight        = UIDeviceOrientationLandscapeLeft

    } __TVOS_PROHIBITED;

區別與UIDeviceOrientation,表示我們開發的程式介面的方向使用UIInterfaceOrientation。
值得注意的是:

UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight, 
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft

我們可以發現兩者的列舉值大多是可以對應上的。只有左右旋轉的時候是UIInterfaceOrientationLandscapeLeft 與UIDeviceOrientationLandscapeRight相等,反之亦然,這是因為向左旋轉裝置需要旋轉程式介面右邊的內容。

3.頁面方向:UIInterfaceOrientationMask

UIInterfaceOrientationMask是iOS6之後增加的一種列舉,其原始碼如下:

typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {

    UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),

    UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),

    UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),

    UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),

    UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),

    UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),

    UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),

} __TVOS_PROHIBITED;

我們知道UIDeviceOrientation與UIInterfaceOrientation的區別在於:前者是真實的裝置方向,後者是頁面方向。

而UIInterfaceOrientation和UIInterfaceOrientationMask的區別是什麼呢?其實觀察原始碼,我們就會發現這是一種為了支援多種UIInterfaceOrientation而定義的型別。下面的示例將很好的說明這點:

在iOS6之後,控制單個介面的旋轉我們通常是下面三個方法來控制:

//方法1
- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
//方法2
- (UIInterfaceOrientationMask)supportedInterfaceOrientations NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
// Returns interface orientation masks.
//方法3
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;

方法2的作用是設定當前介面支援的所有方向,所以返回值是UIInterfaceOrientationMask,更加方便的表達支援多方向旋轉的情況。

方法3的作用是設定進入介面預設支援的方向,使用了返回值型別UIInterfaceOrientation,預設進入介面的方向是個確定的方向,所以使用UIInterfaceOrientation更適合。

二、兩種螢幕旋轉的觸發方式

我們開發的App的,大多情況都是大多介面支援豎屏,幾個特別的介面支援旋轉橫屏,兩種介面相互切換,觸發其旋轉有兩種情況:

情況1:系統沒有關閉自動旋轉螢幕功能,

這種情況,支援旋轉的介面跟隨使用者手持裝置旋轉方向自動旋轉。我們需要在當前檢視控制器中新增如下方法:

//1.決定當前介面是否開啟自動旋轉螢幕,如果返回NO,後面兩個方法也不會被呼叫,只是會支援預設的方向
- (BOOL)shouldAutorotate {
      return YES;
}

//2.返回支援的旋轉方向
//iPad裝置上,預設返回值UIInterfaceOrientationMaskAllButUpSideDwon
//iPad裝置上,預設返回值是UIInterfaceOrientationMaskAll
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
     return UIInterfaceOrientationMaskAll;
}

//3.返回進入介面預設顯示方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
     return UIInterfaceOrientationPortrait;
}

情況2:單個介面強制旋轉

在程式介面通過點選等方式切換到橫屏(尤其是視訊播放的情況),有以下兩種方法:

// 方法1:
- (void)setInterfaceOrientation:(UIDeviceOrientation)orientation {
      if ([[UIDevice currentDevice]   respondsToSelector:@selector(setOrientation:)]) {
          [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:orientation]     
                                       forKey:@"orientation"];
        }
    }

//方法2:
- (void)setInterfaceOrientation:(UIInterfaceOrientation)orientation {
   if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
            SEL selector = NSSelectorFromString(@"setOrientation:");
            NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice     
        instanceMethodSignatureForSelector:selector]];
            [invocation setSelector:selector];
            [invocation setTarget:[UIDevice currentDevice]];
            int val = orientation;
            [invocation setArgument:&val atIndex:2];
            [invocation invoke];
        }
    }

注意:使用這兩個方法的時候,也要確保shouldAutorotate方法返回YES,這樣這兩個方法才會生效。還要注意兩者使用的引數型別不同。

三、螢幕旋轉控制的優先順序

事實上,如果我們只用上面的方法來控制旋轉的開啟與關閉,並不能符合我們的需求,而且方法無效。這是因為我們忽略了旋轉許可權優先順序的問題。關於螢幕旋轉的設定有很多,有Xcode的General設定,也有info.plist設定,更還有程式碼設定等,這麼多的設定很是繁雜。但是這些其實都是在不同級別上實現旋轉的設定,我們會遇到設定關閉旋轉無效的情況,這就很可能是被上一級別控制的原因。

我們首先有個大致的瞭解,控制螢幕旋轉優先順序為:工程Target屬性配置(全域性許可權) = Appdelegate&&Window > 根檢視控制器> 普通檢視控制器

四、開啟螢幕旋轉的全域性許可權

這裡我使用全域性許可權來描述這個問題可能不太準備,其實是設定我們的裝置能夠支援的方向有哪些,這也是實現旋轉的前提。
開啟螢幕旋轉的全域性許可權有三種方法,包括通過Xcode直接配置的兩種方法和程式碼控制的一種方法。這三種方法作用相同,但是由於程式碼的控制在程式啟動之後,所以也是最有效的。下面分別對三種方法的用法介紹:

1.Device Orientation屬性配置

我們建立了新工程,Xcode就預設替我們選擇了支援旋轉的幾個方向,這就是Device Orientation屬性的預設配置。在Xcode中依次開啟:【General】—>【Deployment Info】—>【Device Orientation】,我們可以看到預設支援的裝置方向如下:

image.png

可以發現,UpsideDown沒有被預設支援,因為對於iPhone即使勾選也沒有UpSideDown的旋轉效果。我們可以在這裡勾選或者取消以修改支援的旋轉方向。如果是iPad裝置勾選之後會同時支援四個方向。

值得注意的是,對於iPhone,如果四個屬性我們都選或者都不選,效果和預設的情況一樣。

2.Info.Plist設定

其實我們設定了Device Orientation之後,再到info.plist中檢視Supported interface orientation,我們會看到:

螢幕快照 2018-01-11 下午5.27.53.png

沒錯,此時Supported interface orientation裡的設定和UIDevice Orientation的值一致的,並且我們在這裡增加或者刪除其中的值,UIDevice Orientation的值也會隨之變化,兩者屬於同一種設定。

3.Appdelegate&&Window中設定

正常情況下,我們的App從Appdelegate中啟動,而Appdelegate所持有唯一的Window物件是全域性的,所以在Appdelegate檔案中設定螢幕旋轉也是全域性有效的。下面的程式碼設定了只支援豎屏和右旋轉:

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {

    return  UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;

}

值得注意的是:如果我們實現了Appdelegate的這一方法,那麼我們的App的全域性旋轉設定將以這裡的為準,即使前兩種方法的設定與這裡的不同。

五、開啟螢幕旋轉的區域性許可權(檢視控制器)

在設定了全域性所支援的旋轉方向後,接著就開始設定具體的控制器介面了。我們在上面已經說明了關於旋轉的優先順序了。而這裡主要涉及了三種檢視控制器(UITabbarViewController,UINavigationBarController ,UIViewController)

自全域性許可權開啟之後,接下來具有最高許可權的就是Window的根檢視控制器rootViewController了。如果我們要具體控制單個介面UIViewController的旋轉就必須先看一下根檢視控制器的配置情況了。

當然,在一般情況下,我們的專案都是用UITabbarViewController作為Window的根檢視控制器,然後管理著若干個導航控制器UINavigationBarController,再由導航欄控制器去管理普通的檢視控制器UIViewController。若以此為例的話,關於旋轉的優先順序從高到低就是UITabbarViewController>UINavigationBarController >UIViewController了。如果具有高優先順序的控制器關閉了旋轉設定,那麼低優先順序的控制器是無法做到旋轉的。

比如說我們設定要單個檢視控制器可以自動旋轉,這需要在檢視控制器中增加shouldAutorotate方法返回YES或者NO來控制。但如果存在上層根檢視控制器,而我們只在這個檢視控制器中實現方法,會發現這個方法是不走的,因為這個方法被上層根檢視控制器攔截了。理解這個原理後,我們有兩種方法實現自動可控的旋轉設定。

方法1:逐級設定各檢視控制器,高優先順序的檢視控制器影響低優先順序控制器,

解決上述的問題我們需要設定UITabbarViewController如下:

//是否自動旋轉
-(BOOL)shouldAutorotate{
    return self.selectedViewController.shouldAutorotate;
}

//支援哪些螢幕方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations];
}

//預設方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}

設定導航控制器UINavigationController如下:

//是否自動旋轉
//返回導航控制器的頂層檢視控制器的自動旋轉屬性,因為導航控制器是以棧的原因疊加VC的
//topViewController是其最頂層的檢視控制器,
-(BOOL)shouldAutorotate{
    return self.topViewController.shouldAutorotate;
}

//支援哪些螢幕方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}

//預設方向
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

到這裡,我們就應該明白了,其實就是高優先順序的檢視控制器要跟隨低優先順序控制器的旋轉配置。這樣就能夠達到目的。

方法2: 另闢蹊徑,使用模態檢視

使用模態檢視可以不受這種根檢視控制器優先順序的限制。這個也很容易理解,模態彈出的檢視控制器是隔離出來的,不受根檢視控制的影響。具體的設定和普通檢視器程式碼相同,這裡就不累述了。

六、實現需求:專案主要介面豎屏,部分介面橫屏

這其實也是一個我們做螢幕旋轉最常見的需求,在根據上面的講述之後,我們實現這個需求會很容易,但是具體的實現卻有著不同的思路,我在這裡總結了兩種方法:

方法1:使用基類控制器逐級控制

步驟:
1.開啟全域性許可權設定專案支援的旋轉方向
2.根據第五節中的方法1,自定義標籤控制器和導航控制器來設定螢幕的自動旋轉。
3.自定義基類控制器設定不支援自動旋轉螢幕,並預設只支援豎屏
4.對專案中需要轉螢幕的控制器開啟自動旋轉螢幕、設定支援的旋轉方向並設定預設方向

方法2:Appdelegate增設旋轉屬性

步驟:
1.在Applegate檔案中增加一個用於記錄當前螢幕是否橫屏的屬性
2.需要橫屏的介面,進入介面後強制橫屏,離開介面時恢復豎屏

七、預設橫屏無效的問題

在上面的專案中,我們可能會遇到一個關於預設橫屏的問題,把它拿出來細說一下。
我們專案中有支援豎屏的介面A,也有支援橫豎屏的介面B,而且介面B需要進入時就顯示橫屏。從介面A到介面B中,如果我們使用第五節中的方法1會遇到無法顯示預設橫屏的情況,因為沒有旋轉裝置,shouldAutorotate就沒被呼叫,也就沒法顯示我們需要的橫屏。這裡有兩個解決方法:

方法1:在自定義導航控制器中增加以下方法

#pragma mark -UINavigationControllerDelegate
//不要忘記設定delegate
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [self presentViewController:[UIViewController new] animated:NO completion:^{
        [self dismissViewControllerAnimated:NO completion:nil];
    }];
}

這個方法的缺點是,原理上利用彈出模態檢視來呼叫轉屏,造成切換介面的時候有閃爍效果,體驗不佳。所以這裡也只是提供一種思路,不推薦使用。

方法2:在需要預設橫屏的介面裡設定,進入時強制橫屏,離開時強制豎屏

關於這種使用,這個具體可以參考第五節中的demo2

注:兩種方法不可同時使用

八、關於旋轉後的適配問題

螢幕旋轉的實現會帶來相應的UI適配問題,我們需要針對不同方向下的介面重新調整檢視佈局。首先我們要能夠監測到螢幕旋轉事件,這裡分為兩種情況:

1.檢視控制器UIViewController裡的監測

當發生轉屏事件的時候,下面的UIViewControoller方法會監測到檢視View的大小變化,從而幫助我們適配

/*
This method is called when the view controller's view's size is
changed by its parent (i.e. for the root view controller when its window rotates or is resized).

If you override this method, you should either call super to
propagate the change to children or manually forward the 
change to children.
 */
- (void)viewWillTransitionToSize:(CGSize)size 
withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator NS_AVAILABLE_IOS(8_0);

從註釋裡可以看出此方法在螢幕旋轉的時候被呼叫,我們使用時候也應該首先呼叫super方法,具體程式碼使用示例如下:

//螢幕旋轉之後,螢幕的寬高互換,我們藉此判斷重新佈局
//橫屏:size.width > size.height
//豎屏: size.width < size.height
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    if (size.width > size.height) {
        //橫屏設定,為防止遮擋鍵盤,調整輸入檢視的高度
        self.textView_height.constant = 50;
    }else{
        //豎屏設定
        self.textView_height.constant = 200;
    }
}

2.子檢視橫豎屏監測

如果是類似於表檢視的單元格,要監測到螢幕變化實現適配,我們需要用到layoutSubviews方法,因為螢幕切換橫豎屏時會觸發此方法,然後我們根據狀態列的位置就可以判斷橫豎屏了,程式碼示例如下:

- (void)layoutSubviews {
    [super layoutSubviews];
     //通過狀態列電池圖示判斷橫豎屏
    if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationMaskPortrait) {
        //豎屏佈局
    } else {
        //橫屏佈局
    }
}

九、APP啟動即全屏

有時專案需要從App啟動就預設是橫屏,這裡有個很方便的方法,就是我們在Device Orientation屬性配置裡設定如下:

image.png

但是隻這樣處理的話,會讓專案只支援橫屏,所以我們可以在Appdelegate裡再次調整我們所支援的方向,方法已經說過,這裡就不累述了。

十、最後總結:

關於螢幕旋轉的使用大致總結到這裡了,如果存在疏漏與錯誤歡迎路過的朋友指正!謝謝~

相關推薦

iOS橫豎旋轉及其基本方法

前段時間抽空總結了一下iOS視訊播放的基本用法,發現這其中還有一個我們無法繞過的問題,那就是播放介面的旋轉與適配。的確,視訊播放與遊戲型別的App經常會遇到這個的問題。由於至今接手的專案中不常涉及這塊知識疏於總結,在搜尋了一些資料後也發現都很散亂,所以決定在

ipad橫豎切換,頁面方法

如果想始終橫屏展示給使用者,方法有很多,我也來寫幾種吧: 1.簡單粗暴型:當ipad豎屏的時候,給一個蒙層提示,讓客戶不得不進行橫屏操作 // ipad豎屏適配     var detectOrient = function() {       var width = d

要把劉海進行到底:iOS新規要求所有App劉海

就在昨晚,蘋果正式推出了iOS 11.4 Beta 2的公測版本,相信在不久後蘋果就會正式推送iOS 11.4,而iOS 11.4也很可能是iOS 11的最後一個版本。在即將到來的6月,蘋果將會推出全新的iOS 12作業系統。 近日,蘋果釋出公

程式碼處理 iOS橫豎旋轉

一、監聽螢幕旋轉方向 在處理iOS橫豎屏時,經常會和UIDeviceOrientation、UIInterfaceOrientation和UIInterfaceOrientationMask這三個列舉型別打交道,它們從不同角度描述了螢幕旋轉方向。 1、UIDevic

【轉】web app變革之rem(手機幕實現全

理想 那種 內嵌 自己的 大屏幕 block 行業 尺寸 是我 以往web移動適配,常規寫法是:media only screen @media only screen and (min-device-width: 320px){ //針對iP

iOS字型根據不同螢幕尺寸

因為檢視使用storyboard 和 XIB拖拽進來了,如果需要對不同大小的螢幕進行Font 字型適配的話可以使用分類。 在load 方法中 利用OC的執行時機制,對所有的 UIButton 、UILabel 做處理。 關鍵程式碼: UIButton 按鈕的處理方式 

Android全面虛擬導航欄

手機正朝著全面屏的方向演進,與此同時也給開發者帶來了很多適配上的新問題,虛擬導航欄就是其中一個。最近在糗百的專案中,就有相關的適配問題,我查閱了目前關於虛擬導航欄適配的相關文章,基本上在全面屏手機裡都有不同程度的失效,這使我不禁開始思考這個問題, 為什麼我們對虛擬導航欄的判斷在全面屏中失效

[iOS]UITableViewController 無法實現鍵盤自動

蘋果官方文件: The UITableViewController class implements the foregoing behavior by overriding loadView, viewWillAppear:, and other met

IOS橫豎

1.兩種螢幕旋轉的觸發方式 我們開發的App的,大多情況都是大多介面支援豎屏,幾個特別的介面支援旋轉橫屏,兩種介面相互切換,觸發其旋轉有兩種情況: 情況1:系統沒有關閉自動旋轉螢幕功能 //1.決定當前介面是否開啟自動旋轉螢幕,如果返回NO,後面兩個方法也不會被呼叫,只是會支援預設的方向

全面及虛擬鍵說明

小米:https://dev.mi.com/console/doc/detail?pId=1160 官方:https://developer.android.com/guide/practices/screens_support#NewQualifiers 1. 前言 自2016年小

頁面響應式玩法

首先瞅一下效果圖 接著就是思考怎麼做,我的想法如下圖。 把公共的 頁頭 、頁尾、導航欄、邊框 放到最頂層,比方說設定層級為 999,其他每個獨立頁則放在下面,然後切換頁面的時候更新獨立頁的層級以達到效果圖的效果(當然不能超過最頂層)。 適配 上面的方式已經把效果做出來了,接

初識 iOS9 iPad 新特性 SlideView 及其

蘋果剛釋出了iOS9,在iPad上新增了兩個新的特性SlideView和SplitView,前者可以在不關閉當前啟用APP的情況下調出來另外個APP以30%比例顯示進行操作使用,後者允許同時執行兩個APP以50%50%,70%30%比例執行,感覺非常方便。 然而,方便了使用者的

iOS之旅--iOS11的一些工作

跳轉App Store評論 - (void)gotoAppStoreEvaluate { //1028355284是我們APP的appID,替換成你的應用的appID即可 NSStri

IOS專案新手引導頁圖片方案

1. 背景基本上每個IOS APP都會有新手引導頁面這個功能,常規的就是幾張靜態圖片,可以左右滾動。既然涉及到圖片,就肯定會存在適配的問題(為了達到最優的體驗效果,一般都會針對不同的解析度設計不同尺寸的圖片),本文主要就是討論如何適配的問題。2. 方案2.1 方案一 根據螢幕解析度的不同,使用不同的圖片。2

iOS使用autolayout和sizeclass 解決問題(一)

一。為啥使用autolayout?使用 autolayout 有什麼好處?      隨著iPhone的種類不斷增多,不同尺寸、不同解析度的iOS裝置將會越來越多,使用傳統frame佈局的工作量必

iOS開發 關於iPhone X 的

1.螢幕尺寸相關變化 高度增加了145pt,變成812pt. 螢幕圓角顯示,注意至少留10pt邊距。 狀態列高度由20pt變成44pt,留意這個距離就能避開“劉海”的尷尬,相應的導航欄以上變化64->88。 底部工具欄需要為home indicator留出34

android 劉海方法

背景自從iphone x釋出後,各大廠商也釋出了類似的劉海屏手機(“頂部螢幕凹槽設計”),開發者應該如何適配呢?原理為什麼會有劉海屏?因為大家有自拍的需求,需要攝像頭前置,除了攝像頭前置外,劉海屏上還有一些其他的感測器,所以不同廠商的劉海屏長度也不相同。劉海屏是如何實現的?第

全面/劉海及虛擬鍵--總結版

什麼是劉海屏? 隨著iPhone X釋出,劉海屏手機大行其道 ,Google Android P版本的釋出,也引入了劉海屏的概念 即將釋出的Android p也提供了對劉海屏的支援。像 華為P20 pro, vivo X21,OPPO R15 華為nova 3e,紅米n

Android ConstraintLayout百分比佈局-終結者(基本所有機型)

對於Android開發者來講,適配始終是個大問題,在小米手機上面是一個樣,在oppo上面是一個樣,真是讓人惱火。 現在講一下筆者最近遇到的問題,公司專案需求,一顆樹,樹有很有枝椏,枝椏上面要掛紅包,這需求是真坑爹,精度要求特別高,這肯定不能使用DP適配了,最開始想自己根據螢

手淘啟動頁全面和虛擬鍵

312ppi再對應上面的螢幕適配標準,應該放到xhdpi裡面。這裡為什麼要以真機舉例呢,這是因為純圖片尺寸只有畫素的概念,單純給定一張圖片,說他的dpi是多少,該放哪個資料夾是沒辦法決斷的,所以給定一張圖我們決定要放置到哪個目錄,一般會取市面上同分辨率的有代表性的機器,計算出對應的dpi再決定。或者做的更好的