iOS实战 | 封装最适合你APP的整套toast

·  阅读 749
原文链接: www.jianshu.com
IU

啥是toast?

在安卓里有个控件叫toast,小小的,黑黑的,展示少量信息,转瞬即逝:

Android toast

iOS里的toast

iOS里木有自带的toast。因此要实现安卓那样的toast,只有自己封装一个,一般来说对于一个稍微成熟点的APP,toast都是必不可少的。

封装的toast.gif

封装toast的基本思路

toast可以看做是一个自定义view,展示toast就是将这个自定义view添加到顶层window上。


封装最适合你APP的整套toast

1.整理分析toast的所有样式

一个APP很可能不止一种样式的toast。

它可以是一个纯文本toast:

也可以是一个既有文本又有图片的toast:

还可以只有图片:

这是我APP中toast的所有样式,你的APP也许会更多。

整理分析APP中toast的所有样式是定制封装的前提。

2.接口设计

在满足需求的前提下,接口当然是使用越方便越好。我比较喜欢一句代码的调用:

#import <UIKit/UIKit.h>

UIKIT_EXTERN NSNotificationName const CQToastWillShowNotification;
UIKIT_EXTERN NSNotificationName const CQToastDidShowNotification;
UIKIT_EXTERN NSNotificationName const CQToastWillDismissNotification;
UIKIT_EXTERN NSNotificationName const CQToastDidDismissNotification;

@interface CQToast : UIView

#pragma mark - show toast

/** 纯文本toast */
+ (void)showWithMessage:(NSString *)message;
/**
 纯文本toast

 @param message 提示内容
 @param duration toast展示时间
 */
+ (void)showWithMessage:(NSString *)message duration:(NSTimeInterval)duration;

/** 图文toast */
+ (void)showWithMessage:(NSString *)message image:(NSString *)imageName;
/**
 图文toast

 @param message 提示内容
 @param imageName 图片名
 @param duration toast展示时间
 */
+ (void)showWithMessage:(NSString *)message image:(NSString *)imageName duration:(NSTimeInterval)duration;

/** 赞 */
+ (void)showZan;
+ (void)showZanWithDuration:(NSTimeInterval)duration;

#pragma mark - 设置默认值

/** 设置toast的默认背景颜色 */
+ (void)setDefaultBackgroundColor:(UIColor *)defaultBackgroundColor;
/** 设置默认字体颜色,未设置为白色 */
+ (void)setDefaultTextColor:(UIColor *)defaultTextColor;
/** 设置toast展示的默认时间,未设置为2秒 */
+ (void)setDefaultDuration:(NSTimeInterval)defaultDuration;
/** 设置toast消失的默认时间,未设置为0.3秒 */
+ (void)setDefaultFadeDuration:(NSTimeInterval)defaultFadeDuration;

#pragma mark - 重置为初始状态

/** 重置为初始状态(这个方法适用于某次改变默认值后又想改回去的情况) */
+ (void)reset;

@end复制代码

3.细节

toast到底add到哪个window上?

delegate.window?
keyWindow?

看过我封装弹窗的都知道我钟爱delegate.window,因为delegate.window是不变的,而keyWindow是变化的,在一个变化的window上addSubview,某些情况下会出现你想不到的bug。

所以toast还是应该add到delegate.window上?

非也。在实际场景中,很多时候,show toast的时候键盘是展开的。比如用户输完密码点击登录按钮,这个时候键盘是展开的,如果toast是add到delegate.window上的,toast会被键盘挡住,用户是看不到的。即使是add到keyWindow上,toast依然会被键盘挡住,因为,键盘window的层级是最高的

这个时候有两种选择:

  1. 显示toast的时候隐藏键盘
  2. 将toast添加到键盘window上

这两种方案都不能说完美。隐藏键盘不仅要多写点代码并且用户体验并不是那么好;将toast添加到键盘window上,如果用户关闭键盘,随着键盘的消失toast也会消失。

考虑到用户应该不会那么无聊:展示toast的时候立即关闭键盘。我还是决定采用方案2——

[[UIApplication sharedApplication].windows.lastObject addSubview:toast];复制代码

代码详情及demo

上面我主要讲了我的封装思路,具体的实现代码我这里就不贴了,需要的可以去github下载:

github.com/CaiWanFeng/…

我个人认为我的代码质量还是相当高的,如果你还能给我挑刺,我只能说:万分感谢!

收藏成功!
已添加到「」, 点击更改