开发过程中,我们经常用到弹窗界面,各式各样的弹窗,五花八门,眼花缭乱,个人感觉,还是系统的UI看着让人舒服!

那么实现一个弹窗,你可能首先想到的是UIAlertView,但是这个类苹果在iOS9.0就废弃了:
NS_CLASS_DEPRECATED_IOS(2_0, 9_0, “UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead”)
从他的提示看,系统希望我们使用UIAlertController来代替.当然,我相信每一个iOS开发者都能熟练的写出UIAlertController弹窗.今天我们来说说简单的设置弹窗标题、消息文字color和font,以及按钮color的实现.

  • 我们先来创建一个弹窗
/*
  UIAlertControllerStyleActionSheet //底部
  UIAlertControllerStyleAlert //中间弹窗
  */
  UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"通知" message:@"你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!" preferredStyle:UIAlertControllerStyleAlert];//使用弹窗模式

  /*
  UIAlertActionStyleDefault,默认 显示蓝色
  UIAlertActionStyleCancel,取消 显示蓝色
  UIAlertActionStyleDestructive,警告 显示红色
  */
  //添加事件
  UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
  	NSLog(@"取消");
  }];

  UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  	NSLog(@"确定");
  }];
  //添加action
  [alertVC addAction:cancelAction];
  [alertVC addAction:confirmAction];
  //展示
  [self presentViewController:alertVC animated:YES completion:nil];

iOS顶部弹出消息 苹果顶部弹窗_iOS顶部弹出消息

  • 下面我们创建两个分类:UIAlertController的分类UIAlertController+WMAlertSetting.h"和UIAlertAction的分类"UIAlertAction+WMActionSetting.h".然后通过runtime绑定属性来设置.
UIAlertController的分类
  • UIAlertController+WMAlertSetting.h声明
#import <UIKit/UIKit.h>

  @interface UIAlertController (WMAlertSetting)
  //标题颜色
  @property (nonatomic ,strong) UIColor *titleColor;
  //标题字体
  @property (nonatomic ,strong) UIFont *titleFont;
  //设置标题的富文本属性
  @property (nonatomic ,strong) NSAttributedString *titleAttributedString;
  //message颜色
  @property (nonatomic ,strong) UIColor *messageColor;
  //message字体
  @property (nonatomic ,strong) UIFont *messageFont;
  //设置message的富文本属性
  @property (nonatomic ,strong) NSAttributedString *messageAttributedString;

  @end
  • UIAlertController+WMAlertSetting.m实现
#import "UIAlertController+WMAlertSetting.h"
  #import <objc/runtime.h>
  
  @implementation UIAlertController (WMAlertSetting)
  //自己来实现 setter 和 getter
  @dynamic titleColor;
  @dynamic titleFont;
  @dynamic messageColor;
  @dynamic messageFont;

  /**
  titleColor 标题颜色的 getter 和 setter
  */
  static char *titleColorKey = "titleColorKey";

  - (UIColor *)titleColor {
  	id color = objc_getAssociatedObject(self, titleColorKey);
  	if (color == nil) {
  		return [UIColor darkTextColor];
  	} else {
  		return color;
  	}
  }

  - (void)setTitleColor:(UIColor *)titleColor {
  	objc_setAssociatedObject(self, titleColorKey, titleColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  	NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.title attributes:@{NSFontAttributeName:self.titleFont,NSForegroundColorAttributeName:titleColor}];
  	[self setValue:attributedString forKey:@"attributedTitle"];
  }

  /**
  titleFont 标题字体的 getter 和 setter
  */

  static char *titleFontKey = "titleFontKey";

  - (UIFont *)titleFont {
  	id font = objc_getAssociatedObject(self, titleFontKey);
  	if (font == nil) {
  		return [UIFont systemFontOfSize:15];
  	} else {
  		return font;
  	}
  }

  - (void)setTitleFont:(UIFont *)titleFont {
  	objc_setAssociatedObject(self, titleFontKey, titleFont, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  	NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.title attributes:@{NSFontAttributeName:titleFont,NSForegroundColorAttributeName:self.titleColor}];
  	[self setValue:attributedString forKey:@"attributedTitle"];
  }

  /**
  messageColor message颜色的 getter 和 setter
  */

  static char *messageColorKey = "messageColorKey";

  - (UIColor *)messageColor {
  	id color = objc_getAssociatedObject(self, messageColorKey);
  	if (color == nil) {
  		return [UIColor darkGrayColor];
  	} else {
  		return color;
  	}
  }

  - (void)setMessageColor:(UIColor *)messageColor {
  	objc_setAssociatedObject(self, messageColorKey, messageColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  	NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.message attributes:@{NSFontAttributeName:self.messageFont,NSForegroundColorAttributeName:messageColor}];
  	[self setValue:attributedString forKey:@"attributedMessage"];
  }

  /**
  messageColor message字体的 getter 和 setter
  */

  static char *messageFontKey = "messageFontKey";

  - (UIFont *)messageFont {
  	id font = objc_getAssociatedObject(self, messageFontKey);
  	if (font == nil) {
  		return [UIFont systemFontOfSize:13];
  	} else {
  		return font;
  	}
  }

  - (void)setMessageFont:(UIFont *)messageFont {
  	objc_setAssociatedObject(self, messageFontKey, messageFont, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  	NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.message attributes:@{NSFontAttributeName:messageFont,NSForegroundColorAttributeName:self.messageColor}];
  	[self setValue:attributedString forKey:@"attributedMessage"];
  }

  /**
  titleAttributedString 为标题赋值的富文本属性 getter 和 setter
  */

  static char *titleAttributedStringKey = "titleAttributedStringKey";
  - (NSAttributedString *)titleAttributedString {
  	return [self valueForKey:@"attributedTitle"];
  }
  - (void)setTitleAttributedString:(NSAttributedString *)titleAttributedString {
  	objc_setAssociatedObject(self, titleAttributedStringKey, titleAttributedString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  	[self setValue:titleAttributedString forKey:@"attributedTitle"];
  }

  /**
  messageAttributedString 为message赋值的富文本属性 getter 和 setter
  */

  static char *messageAttributedStringKey = "messageAttributedStringKey";

  - (NSAttributedString *)messageAttributedString {
  	return [self valueForKey:@"attributedMessage"];
  }

  - (void)setMessageAttributedString:(NSAttributedString *)messageAttributedString {
  	objc_setAssociatedObject(self, messageAttributedStringKey, messageAttributedString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  	[self setValue:messageAttributedString forKey:@"attributedMessage"];
  }

  @end
UIAlertAction的分类
  • UIAlertAction+WMActionSetting.h声明
#import <UIKit/UIKit.h>

  @interface UIAlertAction (WMActionSetting)
  
  //按钮title的颜色
  @property (nonatomic ,strong) UIColor *titleColor;

  @end
  • UIAlertAction+WMActionSetting.m实现
#import "UIAlertAction+WMActionSetting.h"
  #import <objc/runtime.h>

  @implementation UIAlertAction (WMActionSetting)

  @dynamic titleColor;

  static char *titleColorKey = "titleTextColor";///按钮title颜色

  - (UIColor *)titleColor {
  	id color = objc_getAssociatedObject(self, titleColorKey);
  	if (color == nil) {
  		return [UIColor lightGrayColor];
  	} else {
  		return color;
  	}
  	return objc_getAssociatedObject(self, titleColorKey);
  }

  - (void)setTitleColor:(UIColor *)titleColor {
  	objc_setAssociatedObject(self, titleColorKey, titleColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  	[self setValue:titleColor forKey:@"titleTextColor"];
  }
  @end
使用分类实现弹窗
  • 先看效果
/*
  UIAlertControllerStyleActionSheet //底部
  UIAlertControllerStyleAlert //中间弹窗
  */
  UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"通知" message:@"你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!你好吗!" preferredStyle:UIAlertControllerStyleAlert];

  alertVC.titleFont = [UIFont systemFontOfSize:16];
  alertVC.titleColor = [UIColor redColor];
  alertVC.messageFont = [UIFont systemFontOfSize:14];
  alertVC.messageColor = [UIColor purpleColor];

  /*
  UIAlertActionStyleDefault,
  UIAlertActionStyleCancel,
  UIAlertActionStyleDestructive
  */
  UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
  	NSLog(@"取消");
  }];
  cancelAction.titleColor = [UIColor greenColor];

  UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  
  }];
  confirmAction.titleColor = [UIColor orangeColor];

  [alertVC addAction:cancelAction];
  [alertVC addAction:confirmAction];
  [self presentViewController:alertVC animated:YES completion:nil];
添加TextField输入框
  • UIAlertController类中有一个对象方法:
//此方法只能使用UIAlertControllerStyleAlert样式时使用,否则崩溃
  - (void)addTextFieldWithConfigurationHandler:(void (^ __nullable)(UITextField *textField))configurationHandler;

  //在此回调中,设置textField的属性及添加监听;
  //在UIAlertController添加的action回调中,获取用户输入的文字.