啥是toast?
在安卓里有个控件叫toast,小小的,黑黑的,展示少量信息,转瞬即逝:
Android toastiOS里的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的层级是最高的。
这个时候有两种选择:
- 显示toast的时候隐藏键盘
- 将toast添加到键盘window上
这两种方案都不能说完美。隐藏键盘不仅要多写点代码并且用户体验并不是那么好;将toast添加到键盘window上,如果用户关闭键盘,随着键盘的消失toast也会消失。
考虑到用户应该不会那么无聊:展示toast的时候立即关闭键盘。我还是决定采用方案2——
[[UIApplication sharedApplication].windows.lastObject addSubview:toast];
代码详情及demo
上面我主要讲了我的封装思路,具体的实现代码我这里就不贴了,需要的可以去github下载:
https://github.com/CaiWanFeng/AlertToastHUD
我个人认为我的代码质量还是相当高的,如果你还能给我挑刺,我只能说:万分感谢!
网友评论