前言
在iOS應(yīng)用程序中,我們經(jīng)彻美叮看到各種各樣的彈出框赊时,比如地理信息、相冊债蜜、相機(jī)、權(quán)限的彈出框究反,圖片來源選擇彈出框寻定,信息提示彈出框,下拉彈出框等精耐。這篇文章主要總結(jié)UIPopoverController狼速、UIPopoverPresentationController、UIAlertView卦停、UIActionSheet向胡、UIAlertController的使用。
UIPopoverController
UIPopoverController是ipad上特有的界面元素惊完,用戶可以在其邊界外單擊來關(guān)閉它捷枯,在iOS9中被棄用,只能使用于iPad专执,在iPhone中奔潰淮捆!它需要一個(gè)UIViewController作為其內(nèi)容,我們應(yīng)該還會考慮彈出窗口的大小與顯示的位置本股∨嗜可以提供一個(gè)CGRect指定彈出窗口的參考位置。用popoverContentSize這個(gè)屬性來設(shè)置彈出框的大小拄显」毒叮可以通過- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated這個(gè)方法來顯示窗口,UIPopoverArrowDirection表示箭頭的方向
//新建一個(gè)內(nèi)容控制器
InfoViewController *infoViewController = [[InfoViewController alloc] init];
UIPopoverController *popViewController = [[UIPopoverController alloc] initWithContentViewController:infoViewController];
//設(shè)置彈出窗口大小躬审,如果屏幕畫不下棘街,會擠小的蟆盐。這個(gè)值默認(rèn)是320x1100
popViewController.popoverContentSize = CGSizeMake(200, 100);
//設(shè)置彈出窗口的參考位置
CGRect rect = CGRectMake(0, 0, 0, 0);
NSIndexPath *indexPath = [weakSelf.tableView indexPathForSelectedRow];
UITableViewCell *cell = [weakSelf.tableView cellForRowAtIndexPath:indexPath];
[popViewController presentPopoverFromRect:rect inView:cell permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
另一種顯示的方法是- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated,這種方式依附于導(dǎo)航欄的UIBarButtonItem上遭殉。
//新建一個(gè)內(nèi)容控制器
InfoViewController *infoViewController = [[InfoViewController alloc] init];
//用于任何容器布局子控制器石挂,彈出窗口的原始大小來自視圖控制器的此屬性,如果設(shè)置了此屬性那么UIPopoverController的popoverContentSize屬性會失效险污。
infoViewController.preferredContentSize = CGSizeMake(200, 200);
UIPopoverController *popViewController = [[UIPopoverController alloc] initWithContentViewController:infoViewController];
//設(shè)置彈出窗口大小痹愚,如果屏幕畫不下,會擠小的蛔糯。這個(gè)值默認(rèn)是320x1100
popViewController.popoverContentSize = CGSizeMake(200, 100);
/*
UIPopoverArrowDirection:箭頭方向
*/
[popViewController presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
需要注意的是如果設(shè)置了彈出控制器的preperredContentSize屬性那么UIPopoverController的popoverContentSize屬性會失效拯腮,另外UIPopoverController有如下幾個(gè)代理方法:
用來決定用戶點(diǎn)擊了蒙版后,popoverController是否可以dismiss,返回YES代表可以蚁飒,返回NO代表不可以
-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
UIPopoverController消失的時(shí)候調(diào)用
-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
UIPopoverController的位置改變的時(shí)候調(diào)用(如豎屏變橫屏)
-(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView * __nonnull * __nonnull)view
UIPopoverController還有兩個(gè)比較有用的屬性动壤,isPopoverVisible屬性是只讀的,用于判斷是否彈出控制器淮逻。還有一個(gè)passthroughViews屬性琼懊,默認(rèn)情況下,UIPopoverController彈出后不允許用戶交互任何視圖彈出框外面弦蹂。passthroughViews屬性允許指定的數(shù)組UIView的實(shí)例允許用戶交互。
//判斷是否彈出控制器
if (weakSelf.popoverController.isPopoverVisible) {
[weakSelf.popoverController dismissPopoverAnimated:YES];
}
else
{
//設(shè)置彈出窗口大小强窖,如果屏幕畫不下凸椿,會擠小的。這個(gè)值默認(rèn)是320x1100
//popViewController.popoverContentSize = CGSizeMake(200, 100);
//設(shè)置彈出窗口的參考位置
CGRect rect = CGRectMake(0, 0, 0, 0);
NSIndexPath *indexPath = [weakSelf.tableView indexPathForSelectedRow];
UITableViewCell *cell = [weakSelf.tableView cellForRowAtIndexPath:indexPath];
//設(shè)置可交互的預(yù)留控件
popViewController.passthroughViews = @[cell];
/*
UIPopoverArrowDirection:箭頭方向
*/
[popViewController presentPopoverFromRect:rect inView:cell permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
UIPopoverPresentationController
UIPopoverPresentationController適用于iPhone和ipad翅溺,不過在iPhone上展現(xiàn)形式就為普通的模態(tài)視圖脑漫,而不是彈窗的形式。UIPopoverPresentationController是UIViewController實(shí)例的屬性咙崎,不需要創(chuàng)建优幸,獲取就可以啦。它同樣需要一個(gè)UIViewController作為其內(nèi)容褪猛,通過設(shè)置UIViewController實(shí)例的modalPresentationStyle的這個(gè)屬性為UIModalPresentationPopover來使用UIPopoverPresentationController网杆,還有就是它是通過- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion 方法來顯示的。其他使用方式和UIPopoverController基本差不多伊滋,列如:
sourceView屬性設(shè)置所依附的控件碳却、
sourceRect屬性設(shè)置彈出窗口對所依附的控件的參考位置、
permittedArrowDirections屬性設(shè)置箭頭方向笑旺、
passthroughViews屬性設(shè)置可交互的預(yù)留控件
//新建一個(gè)內(nèi)容控制器
InfoViewController *infoViewController = [InfoViewController infoViewController];
//用于任何容器布局子控制器昼浦,彈出窗口的原始大小來自視圖控制器的此屬性,如果設(shè)置了此屬性那么UIPopoverController的popoverContentSize屬性會失效筒主。
infoViewController.preferredContentSize = CGSizeMake(200, 200);
//設(shè)置模態(tài)視圖彈出的樣式
[infoViewController setModalPresentationStyle:UIModalPresentationPopover];
//取出點(diǎn)擊的cell
NSIndexPath *indexPath = [weakSelf.tableView indexPathForSelectedRow];
UITableViewCell *cell = [weakSelf.tableView cellForRowAtIndexPath:indexPath];
//UIPopoverPresentationController是UIViewController實(shí)例的屬性关噪,不需要創(chuàng)建鸟蟹,獲取就可以啦
UIPopoverPresentationController *presentationCtr = infoViewController.popoverPresentationController;
//設(shè)置彈出窗口所依附的控件
presentationCtr.sourceView = cell;
//設(shè)置彈出窗口對所依附的控件的參考位置
presentationCtr.sourceRect = CGRectMake(10, 10, 20, 20);
//設(shè)置箭頭方向
presentationCtr.permittedArrowDirections = UIPopoverArrowDirectionLeft;
//設(shè)置代理
presentationCtr.delegate = weakSelf;
//彈出模態(tài)視圖
[weakSelf presentViewController:infoViewController animated:YES completion:nil];
//新建一個(gè)內(nèi)容控制器
InfoViewController *infoViewController = [InfoViewController infoViewController];
//用于任何容器布局子控制器,彈出窗口的原始大小來自視圖控制器的此屬性使兔,如果設(shè)置了此屬性那么UIPopoverController的popoverContentSize屬性會失效建钥。
infoViewController.preferredContentSize = CGSizeMake(200, 200);
//設(shè)置模態(tài)視圖彈出的樣式
[infoViewController setModalPresentationStyle:UIModalPresentationPopover];
//UIPopoverPresentationController是UIViewController實(shí)例的屬性,不需要創(chuàng)建火诸,獲取就可以啦
UIPopoverPresentationController *presentationCtr = infoViewController.popoverPresentationController;
//設(shè)置所依附的UIBarButtonItem
presentationCtr.barButtonItem = weakSelf.navigationItem.rightBarButtonItem;
//設(shè)置箭頭方向
presentationCtr.permittedArrowDirections = UIPopoverArrowDirectionUp;
//設(shè)置代理
presentationCtr.delegate = weakSelf;
//彈出模態(tài)視圖
[weakSelf presentViewController:infoViewController animated:YES completion:nil];
if (weakSelf.presentedViewController) {
[weakSelf dismissViewControllerAnimated:YES completion:nil];
}
else
{
//新建一個(gè)內(nèi)容控制器
InfoViewController *infoViewController = [InfoViewController infoViewController];
//用于任何容器布局子控制器锦针,彈出窗口的原始大小來自視圖控制器的此屬性,如果設(shè)置了此屬性那么UIPopoverController的popoverContentSize屬性會失效置蜀。
infoViewController.preferredContentSize = CGSizeMake(200, 200);
//設(shè)置模態(tài)視圖彈出的樣式
[infoViewController setModalPresentationStyle:UIModalPresentationPopover];
//UIPopoverPresentationController是UIViewController實(shí)例的屬性奈搜,不需要創(chuàng)建,獲取就可以啦
UIPopoverPresentationController *presentationCtr = infoViewController.popoverPresentationController;
//設(shè)置所依附的UIBarButtonItem
presentationCtr.barButtonItem = weakSelf.navigationItem.rightBarButtonItem;
//設(shè)置箭頭方向
presentationCtr.permittedArrowDirections = UIPopoverArrowDirectionUp;
//設(shè)置代理
presentationCtr.delegate = weakSelf;
//取出點(diǎn)擊的cell
NSIndexPath *indexPath = [weakSelf.tableView indexPathForSelectedRow];
UITableViewCell *cell = [weakSelf.tableView cellForRowAtIndexPath:indexPath];
//設(shè)置可交互的預(yù)留控件
presentationCtr.passthroughViews = @[cell];
//彈出模態(tài)視圖
[weakSelf presentViewController:infoViewController animated:YES completion:nil];
}
UIPopoverPresentationControllerDelegate有如下四個(gè)方法:
將要彈出的時(shí)候調(diào)用
-(void)prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController
在這個(gè)方法中設(shè)置是否允許消失
-(BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController
已經(jīng)消失的時(shí)候調(diào)用
-(void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController
用到其他UIView或者CGRect的時(shí)候調(diào)用
-(void)popoverPresentationController:(UIPopoverPresentationController *)popoverPresentationController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing _Nonnull *)view
UIAlertView
UIAlertView 在iOS9中被棄用盯荤,是以彈出選擇框的形式展現(xiàn)馋吗,在iPhone和ipad中都能適用,并且展示效果一致秋秤。它的使用十分簡單:
-(instancetype)initWithTitle:(nullable NSString )title message:(nullable NSString )message delegate:(nullable id /<UIAlertViewDelegate>/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 使用這個(gè)初始化方法可以設(shè)置標(biāo)題宏粤,提示信息,代理對象和操作按鈕灼卢。
-(NSInteger)addButtonWithTitle:(nullable NSString *)title 這個(gè)方法添加按鈕绍哎。
-(nullable UITextField *)textFieldAtIndex:(NSInteger)textFieldIndex 這個(gè)方法獲取
-(void)show 這個(gè)方法用來顯示UIAlertView
numberOfButtons 這個(gè)屬性獲取按鈕的序號
visible 這個(gè)屬性是用來獲知是否顯示的
alertViewStyle 這個(gè)屬性用來設(shè)置樣式的,UIAlertView有如下4中樣式:
- UIAlertViewStyleDefault 默認(rèn)樣式鞋真,沒有熟人框
- UIAlertViewStyleSecureTextInput 有一個(gè)密碼輸入框
- UIAlertViewStylePlainTextInput 有一個(gè)普通文本輸入框
- UIAlertViewStyleLoginAndPasswordInput 有一個(gè)普通文本輸入框和一個(gè)密碼輸入框
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"選擇" message:@"請選擇一個(gè)數(shù)崇堰!" delegate:weakSelf cancelButtonTitle:@"取消" otherButtonTitles:nil];
for (int index = 0; index < 100; index++) {
[alertView addButtonWithTitle:[NSString stringWithFormat:@"%i", index]];
}
[alertView show];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"登錄" message:@"請輸入賬號和密碼!" delegate:weakSelf cancelButtonTitle:@"取消" otherButtonTitles:@"登錄", nil];
[alertView setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput];
UITextField * firstTextField = [alertView textFieldAtIndex:0];
firstTextField.placeholder = @"請輸入賬號涩咖!";
UITextField * secondTextField = [alertView textFieldAtIndex:1];
secondTextField.placeholder = @"請輸入密碼海诲!";
[alertView show];
UIAlertView有如下幾個(gè)代理方法
在點(diǎn)擊按鈕的時(shí)候觸發(fā),buttonIndex為點(diǎn)擊的按鈕序號
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
在將要顯示的時(shí)候觸發(fā)
-(void)willPresentAlertView:(UIAlertView *)alertView
在已經(jīng)顯示的時(shí)候觸發(fā)
-(void)didPresentAlertView:(UIAlertView *)alertView
在將要消失的時(shí)候觸發(fā)
-(void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
在已經(jīng)消失的時(shí)候觸發(fā)
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
在編輯文本框后觸發(fā)
-(BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView NS_DEPRECATED_IOS(2_0, 9_0);
UIActionSheet
在iOS9中被棄用檩互,在iPhone和ipad中都能適用特幔,但展示效果不一致。它的使用也非常簡單:
-(instancetype)initWithTitle:(nullable NSString *)title delegate:(nullable id<UIActionSheetDelegate>)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... 這個(gè)初始化方法設(shè)置標(biāo)題闸昨,代理對象蚯斯,信息,取消按鈕和其他按鈕等
-(void)showFromToolbar:(UIToolbar *)view 從UIToolbar彈出
-(void)showFromTabBar:(UITabBar *)view 從UITabBar彈出
-(void)showFromBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated 從UIBarButtonItem彈出
-(void)showFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated 從UIView彈出
-(void)showInView:(UIView *)view 在UIView上彈出
說明:使用上述彈出方法iPhone上只有一種彈出效果饵较,ipad可以有不同的彈出效果
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"圖片來源" delegate:weakSelf cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"相機(jī)", @"相冊", nil];
[actionSheet showFromTabBar:weakSelf.tabBarController.tabBar];
在點(diǎn)擊按鈕的時(shí)候觸發(fā)溉跃,buttonIndex為點(diǎn)擊的按鈕序號
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
在將要彈出的時(shí)候觸發(fā) - (void)willPresentActionSheet:(UIActionSheet *)actionSheet
在已經(jīng)彈出的時(shí)候觸發(fā) - (void)didPresentActionSheet:(UIActionSheet *)actionSheet
在將要消失的時(shí)候觸發(fā) - (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex
在已經(jīng)消失的時(shí)候觸發(fā) - (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
UIAlertController
UIAlertController 在iOS8中提供,在iPhone和ipad中都能適用告抄,但展示效果不完全一致撰茎。它的使用也十分簡單:
- (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle 這個(gè)工廠方法,創(chuàng)建UIAlertController實(shí)例并設(shè)置相關(guān)屬性
UIAlertController 有兩種風(fēng)格:
UIAlertControllerStyleAlert打洼,和UIAlertView的樣式一致
UIAlertControllerStyleActionSheet龄糊,和UIActionSheet的樣式一致逆粹,在ipad中是通過UIPopoverPresentationController彈出的,所以需要設(shè)置UIPopoverPresentationController的相關(guān)屬性炫惩,否則會出錯(cuò)僻弹。
- (void)addAction:(UIAlertAction *)action 添加UIAlertAction對象
- (void)addTextFieldWithConfigurationHandler:(void (^ __nullable)(UITextField *textField))configurationHandler 添加UITextField,這能為UIAlertControllerStyleAlert這個(gè)樣式時(shí)才能添加UITextField
title 標(biāo)題
message 展示信息
preferredStyle 彈出風(fēng)格
actions 這個(gè)只讀屬性為添加UIAlertAction對象數(shù)組
textFields 這個(gè)只讀屬性為添加UITextField對象數(shù)組
UIAlertAction對象他嚷,就相當(dāng)于按鈕的包裝:
- (instancetype)actionWithTitle:(nullable NSString *)title style:(UIAlertActionStyle)style handler:(void (^ __nullable)(UIAlertAction *action))handler 這個(gè)工廠方法創(chuàng)建UIAlertAction對象蹋绽,并初始化標(biāo)題,樣式筋蓖,和點(diǎn)擊操作的block
title 標(biāo)題
style 樣式
UIAlertActionStyleDefault 默認(rèn)樣式
UIAlertActionStyleCancel 取消樣式
UIAlertActionStyleDestructive 嚴(yán)重操作樣式卸耘,為紅色的
enabled 是否可用
//創(chuàng)建UIAlertController 設(shè)置標(biāo)題,信息粘咖,樣式
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"登錄" message:@"請輸入賬號密碼蚣抗!" preferredStyle:UIAlertControllerStyleAlert];
//添加UITextField
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"請輸入賬號!";
//為UITextField添加監(jiān)聽事件
[textField addTarget:weakSelf action:@selector(textFieldChane:) forControlEvents:UIControlEventEditingChanged];
}];
//添加UITextField
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"請輸入密碼瓮下!";
//為UITextField添加監(jiān)聽事件
[textField addTarget:weakSelf action:@selector(textFieldChane:) forControlEvents:UIControlEventEditingChanged];
}];
//創(chuàng)建UIAlertAction對象翰铡,設(shè)置標(biāo)題并添加到UIAlertController上
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:nil];
[alertController addAction:cancelAction];
UIAlertAction *loginAction = [UIAlertAction actionWithTitle:@"登錄" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
//設(shè)置UIAlertAction對象是否可用
loginAction.enabled = NO;
[alertController addAction:loginAction];
//展現(xiàn)UIAlertController
[weakSelf presentViewController:alertController animated:YES completion:nil];
//創(chuàng)建UIAlertController 設(shè)置標(biāo)題,信息讽坏,樣式
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"圖片來源" message:@"請?zhí)砑訄D片锭魔!" preferredStyle:UIAlertControllerStyleActionSheet];
//創(chuàng)建UIAlertAction對象,設(shè)置標(biāo)題并添加到UIAlertController上
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:cancelAction];
UIAlertAction *photpAction = [UIAlertAction actionWithTitle:@"相冊" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alertController addAction:photpAction];
UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"相機(jī)" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}];
[alertController addAction:cameraAction];
if (IS_IPHONE) {
}
else
{
//如果在ipad上運(yùn)行需要設(shè)置UIPopoverPresentationController的相關(guān)屬性
UIPopoverPresentationController *popoverPresentCtr = alertController.popoverPresentationController;
popoverPresentCtr.barButtonItem = weakSelf.navigationItem.rightBarButtonItem;
}
//展現(xiàn)UIAlertController
[weakSelf presentViewController:alertController animated:YES completion:nil];