iOS开发基础9-提示框(UIAlertController)
1.iOS开发基础1-第一个iOS程序2.iOS开发基础2-基础控件3.iOS开发基础6-懒加载、Plist 文件操作、字典转模型、自定义 View 详解4.iOS开发基础5-UIButton5.iOS开发基础4-图像资源6.iOS开发基础3-UIImage7.iOS开发基础14-KVC的应用与底层逻辑8.iOS开发基础13-深入理解 UITableView(二)9.iOS开发基础12-深入理解UITableView(一)10.iOS开发基础11-屏幕适配、Autolayout及 Masonry 框架11.iOS开发基础10-UIButton内边距和图片拉伸模式
12.iOS开发基础9-提示框(UIAlertController)
13.iOS开发基础8-UIScrollView14.iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View15.iOS开发基础30-UITabBarController16.iOS开发基础29-触摸事件及手势识别17.iOS开发基础28-数据存储与沙盒机制18.iOS开发基础27-导航控制器入栈与出栈机制及微博个人详情页19.iOS开发基础26-空20.iOS开发基础25-ARC和MRC深入探析21.iOS开发基础24-UIPickerView、UITextField、KVC、UIDatePicker、控制器及导航控制器22.iOS开发基础23-iOS开发中的Info.plist、UIApplication及其Delegate、UIWindow详解23.iOS开发基础22-键盘通知在iOS开发中的应用24.iOS开发基础21-深入理解通知、代理、KVO和Block在iOS开发中的应用25.iOS开发基础20-UITableView的全局及局部刷新、左滑操作与批量删除26.iOS开发基础19-深入理解和实现不等高的 UITableViewCell27.iOS开发基础18-深入理解 Objective-C Runtime 机制28.iOS开发基础16-使用 `NSTimer` 时避免内存泄露的技巧和最佳实践29.iOS开发基础15-KVO的应用与底层逻辑30.iOS开发基础65-iPad 开发指南31.iOS开发基础64-二维码32.iOS开发基础63-AVFoundation/MediaPlayer33.iOS开发基础62-音频播放34.iOS开发基础61-通讯录35.iOS开发基础60-传感器36.iOS开发基础59-内存优化37.iOS开发基础58-支付宝集成指南38.iOS开发基础57-换肤功能与静态库开发指南39.iOS开发基础56-UIDynamic物理引擎40.iOS开发基础55-利用 UIWindow 实现快速滚动到界面顶部41.iOS开发基础54-CoreLocation42.iOS开发基础53-MapKit 框架43.iOS开发基础47-iOS键盘44.iOS开发基础46-数据安全与HTTPS保护详解45.iOS开发基础45-UIWebview46.iOS开发基础44-网络编程之NSURLSession&AFN47.iOS开发基础43-CocoaPods48.iOS开发基础42-网络编程之文件下载与处理49.iOS开发基础41-网络编程之JSON和XML50.iOS开发基础40-网络编程之NSURLConnection51.iOS开发基础39-RunLoop52.iOS开发基础38-多线程之多图片下载及缓存处理53.iOS开发基础37-多线程之NSOperation54.iOS开发基础36-多线程之GCD55.iOS开发基础35-多线程之NSThread56.iOS开发基础34-多线程57.iOS开发基础33-核心动画(二)58.iOS开发基础33-核心动画(一)59.iOS开发基础32-Quartz2D(二)60.iOS开发基础32-Quartz2D(一)61.iOS开发基础31-Modal 与 Push 详解62.iOS开发基础76-iOS 开发中的属性修饰符详解63.iOS开发基础75-iOS开发中的Block深度解析64.iOS开发基础74-Swift他来了65.iOS开发基础73-24种性能优化技巧66.iOS开发基础72-Xcode 7 升级后的问题与解决方案详解67.iOS开发基础71-应用中的 StatusBar 详解68.iOS开发基础70-TCP与UDP69.iOS开发基础69-应用开发中的 Controller 间通信模式70.iOS开发基础68-图片轮播71.iOS开发基础67-流水布局相册缩放72.iOS开发基础66-UISearchBar 控件指南73.iOS开发基础78-iOS 国际化在 iOS 开发中,提示框(HUD)是为用户提供即时反馈的一种关键UI元素。本文将详细介绍文本提示框、系统自带的提示框(如 UIAlertView
和 UIActionSheet
)、自定义提示框等内容,深入分析其实现原理及底层逻辑。
一、文本提示框
实现步骤
- 创建提示框控件:在视图中添加一个
UILabel
用于显示提示信息。 - 控制其显示与隐藏:通过透明度和动画控制提示框的显示与隐藏效果。
示例代码
#import "ViewController.h"
@interface ViewController ()
- (IBAction)add;
- (IBAction)remove;
@property (weak, nonatomic) IBOutlet UIView *shopsView;
@property (weak, nonatomic) IBOutlet UIButton *removeBtn;
@property (weak, nonatomic) IBOutlet UIButton *addBtn;
@property (weak, nonatomic) IBOutlet UILabel *hudLabel;
@property (nonatomic, strong) NSMutableArray *shops;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 一开始就让提示框隐藏
self.hudLabel.alpha = 0.0;
}
- (IBAction)add {
// 计算商品控件的X和Y值并创建新的商品视图
CGFloat shopWidth = 70;
CGFloat shopHeight = 100;
CGFloat ColMargin = (self.shopsView.frame.size.width - (3 * shopWidth)) / 2;
CGFloat RowMargin = ColMargin;
NSUInteger index = self.shopsView.subviews.count;
int row = index / 3;
CGFloat shopY = row * (shopHeight + RowMargin);
int col = index % 3;
CGFloat shopX = col * (shopWidth + ColMargin);
XMGShopView *shopView = [XMGShopView shopView];
shopView.frame = CGRectMake(shopX, shopY, shopWidth, shopHeight);
shopView.shop = self.shops[index];
[self.shopsView addSubview:shopView];
self.removeBtn.enabled = YES;
self.addBtn.enabled = self.shopsView.subviews.count < self.shops.count;
if (!self.addBtn.enabled) {
[self showHUDWithText:@"商品柜已经满了, 不要再买买买了..."];
}
}
- (IBAction)remove {
UIView *subView = self.shopsView.subviews.lastObject;
[subView removeFromSuperview];
self.removeBtn.enabled = self.shopsView.subviews.count > 0;
self.addBtn.enabled = YES;
if (!self.removeBtn.enabled) {
[self showHUDWithText:@"商品柜已经空了, 继续买买买..."];
}
}
- (void)showHUDWithText:(NSString *)text {
self.hudLabel.text = text;
[UIView animateWithDuration:1.0 animations:^{
self.hudLabel.alpha = 1.0;
} completion:^(BOOL finished) {
[UIView animateWithDuration:1.0 delay:2.0 options:kNilOptions animations:^{
self.hudLabel.alpha = 0.0;
} completion:nil];
}];
}
- (NSMutableArray *)shops {
if (!_shops) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
NSArray *tempArr = [NSArray arrayWithContentsOfFile:path];
_shops = [NSMutableArray array];
for (NSDictionary *dict in tempArr) {
NJShop *shop = [[NJShop alloc] init];
shop.name = dict[@"name"];
shop.icon = dict[@"icon"];
[_shops addObject:shop];
}
}
return _shops;
}
@end
底层逻辑分析
- 透明度控制:通过透明度来实现提示框的显示和隐藏,结合动画效果使过渡更为流畅。
- 动画:使用 UIView 的动画方法来控制提示框的淡入淡出,以改善用户体验。
二、系统自带的提示框
1. UIAlertView
UIAlertView
是一种简单的提示框,适用于需要用户立即注意的信息。
示例代码
- (void)useAlert {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"哥是标题" message:@"姐是正文..." delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
[alert show];
}
#pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
switch (buttonIndex) {
case 0:
NSLog(@"点击了取消");
break;
case 1:
NSLog(@"点击了确定");
break;
default:
break;
}
}
2. UIActionSheet
UIActionSheet
通常用于多个选择操作。
示例代码
- (void)useActionSheet {
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"哥是标题" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:@"其它", @"Other", nil];
[sheet showInView:self.view];
}
#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
NSLog(@"%ld", (long)buttonIndex);
}
3. UIAlertController
UIAlertController
是 iOS 8 之后引入的,用来取代 UIAlertView
和 UIActionSheet
,提供更强大的功能。
示例代码
- (void)useAlertControllerAlert {
UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:@"哥是标题" message:@"姐是正文..." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
NSLog(@"点击了确定按钮");
}];
UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
NSLog(@"点击了取消按钮");
}];
[alertVc addAction:action1];
[alertVc addAction:action2];
[alertVc addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.text = @"用户名";
}];
[alertVc addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.secureTextEntry = YES;
}];
[self presentViewController:alertVc animated:YES completion:nil];
}
底层逻辑分析
- 委托模式:
UIAlertView
和UIActionSheet
通过委托模式处理用户的点击事件,提供了简单的调用方式。 - 功能增强:
UIAlertController
集成了前两者的功能,且通过闭包实现事件处理,代码更加简洁和灵活。
三、自定义提示框
实现步骤
- 创建覆盖视图:创建覆盖整个屏幕的视图,设置半透明背景。
- 添加
UIActivityIndicatorView
和UILabel
:在覆盖视图上添加菊花和标签以显示加载信息。 - 显示和移除:将覆盖视图添加到主视图,并在操作完成后移除。
示例代码
- (void)useCustomHUD {
UIView *cover = [[UIView alloc] init];
cover.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
cover.frame = CGRectMake(0, 0, 150, 150);
cover.center = self.view.center;
cover.layer.cornerRadius = 10;
[self.view addSubview:cover];
UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activity.center = CGPointMake(cover.frame.size.width * 0.5, 50);
[activity startAnimating];
[cover addSubview:activity];
UILabel *label = [[UILabel alloc] init];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"正在拼命加载中...";
label.frame = CGRectMake(0, cover.frame.size.height - 80, cover.frame.size.width, 80);
[cover addSubview:label];
}
底层逻辑分析
- 覆盖视图:为提示框提供一个独立的、半透明的背景,突出重要信息。
- 菊花和标签:模拟加载动画和提示信息,增强用户体验。
- 灵活性:自定义提示框可以根据需求调整样式和展示内容,满足各种定制化需求。
结论
本文详细介绍了多种提示框的实现方式,包括文本提示框、系统自带提示框(如 UIAlertView
、UIActionSheet
和 UIAlertController
)以及自定义提示框。不同的提示框适用于不同的场景,通过理解其实现机制和底层逻辑,开发者可以根据实际需求选择合适的提示框,提高应用的用户体验。
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!