iOS8 中的UIAlertController

iOS 8.3 以後UIAlertView,跟UIActionSheet都不被推薦使用了,雖然一直知道如此,可是由於手裏的老代碼都是用的UIAlertView,因此歷來沒真正使用過這個UIAlertController。今天寫一個Demo用到提示框,因此試一下。html

##UIAlertControllerios

跟UIAlertView相比,UIAlertController再也不須要實現代理方法,也無需指定按鈕;建立方法:git

//建立控制器
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示:" message:@"我是一條信息" preferredStyle:UIAlertControllerStyleActionSheet];
複製代碼

特別注意第三個參數,它決定了樣式是對話框(alert)仍是上拉菜單(actionSheet)。github

建立好控制器以後,經過UIAlertAction來給控制器添加動做按鈕。bash

//建立動做按鈕:
UIAlertAction *action0 = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"OK selected");
    }];
UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"Cancel selected");
    }];
//把按鈕添加到控制器
[alertVC addAction:action0];
複製代碼

動做按鈕樣式共三張:default,destructive,cancel;值得注意的是若是控制器的樣式選擇了actionSheet,那麼它的destructive按鈕永遠在最前面,不管添加順序是怎樣的,cancel則永遠都在最後,並且只能有一個cancel類型的按鈕。spa

若是你的程序是寫在iPhone上的,那麼很不幸你基本跟下面的內容失之交臂了,而下面的內容纔是真正有趣的部分代理

因爲我寫demo的時候用的設備是iPad,因此當我經過上面的代碼嘗試actionSheet樣式的時候,我遇到了這個錯誤: code

屏幕快照 2016-01-20 23.11.51.png

那麼這是怎麼一回事呢?原來,在常規寬度的設備上,上拉菜單是以彈出視圖的形式展示。彈出視圖必需要有一個可以做爲源視圖或者欄按鈕項目的描點(anchor point)。而iOS8 以後,新出了一個UIPopoverPresentationController類來替代以前的UIPopoverController。htm

##UIPopoverPresentationController 給UIAlertController配置popoverPresentationController:ip

UIPopoverPresentationController *popover = alertVC.popoverPresentationController;
    if (popover) {
        popover.sourceView = sender;
        popover.sourceRect = sender.bounds;
        popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
    }
    
    [self presentViewController:alertVC animated:YES completion:nil];
複製代碼

iOS 8以後,咱們再也不須要給出彈出框的大小,UIAlertController將會根據設備大小自適應彈出框的大小。而且在iPhone或者緊縮寬度的設備中它將會返回nil值。

配置好了popoverPresentationController,不管是在iPhone還iPad上,都沒問題咯。

最後,UIAlertController的popoverPresentationController取消了Canle樣式的action,由於用戶經過點擊彈出視圖外的區域也能夠取消彈出視圖,所以不須要了。

參考文章

我是源碼

相關文章
相關標籤/搜索