源码阅读:JDStatusBarNotification

ThackerayClarence 发布于16天前 阅读39次
0 条评论

JDStatusBarNotification 可以用于在状态栏、应用底部展示一条横幅通知。新版本适配了 iPhone X,支持了显示一条 Process,用法很简单:

[JDStatusBarNotification addStyleNamed:@"failStyleName"
                               prepare:^JDStatusBarStyle *(JDStatusBarStyle *style) {
                                   style.textColor = [UIColor whiteColor];
                                   style.animationType = JDStatusBarAnimationTypeFade;
                                   style.font = [UIFont fontWithName:@"" size:17.0];
                                   return style;
                               }];
[JDStatusBarNotification showWithStatus:@"请求超时"
                           dismissAfter:2.0
                              styleName:@"failStyleName"];

代码概况

JDStatusBarNotification 的类数量很少,只有下列四个

  • JDStatusBarNotification
  • JDStatusBarStyle
  • JDStatusBarView
  • JDStatusBarLayoutMarginHelper

JDStatusBarNotification 是 JDStatusBarNotification 库的使用者接触最多的类,负责操作通知的 show、dismiss。JDStatusBarStyle 负责定义通知的样式。而 JDStatusBarView 是通知的一个 UIView,上面有 textLabel 等。

JDStatusBarNotification

JDStatusBarNotification 包含有四个类:

  • JDStatusBarStyle (Hidden)
  • UIApplication (mainWindow)
  • JDStatusBarNotificationViewController
  • JDStatusBarNotification

其中, JDStatusBarStyle (Hidden) 实际上是对 JDStatusBarNotification 暴露 JDStatusBarStyle 隐藏的两个接口,这样就实现了私有 API 的对接。 UIApplication (mainWindow) 则是分类。

JDStatusBarNotification 暴露的接口有三种(都属于自己的方法):

  • show
  • dismiss
  • setStyle

这些都是使用 JDStatusBarNotification 的「效果」,但是阅读一个公共库不能只知其然,不知其所以然。因此接下来继续了解一下这些功能是怎么实现的。

在 JDStatusBarNotification 的 show 方法都是使用类方法。JDStatusBarNotification 使用的是同一个 sharedInstance,可以理解,因为状态栏通知一般都是只显示一条。

JDStatusBarNotification 的 .m 文件中,interface 如下:

@interface JDStatusBarNotification () <CAAnimationDelegate>
@property (nonatomic, strong, readonly) UIWindow *overlayWindow;
@property (nonatomic, strong, readonly) UIView *progressView;
@property (nonatomic, strong, readonly) JDStatusBarView *topBar;

@property (nonatomic, strong) NSTimer *dismissTimer;
@property (nonatomic, assign) CGFloat progress;

@property (nonatomic, weak) JDStatusBarStyle *activeStyle;
@property (nonatomic, strong) JDStatusBarStyle *defaultStyle;
@property (nonatomic, strong) NSMutableDictionary *userStyles;
@end

UIWindow 是用于显示的所有控件的 superView。 overlayWindow 只设置了他的 windowLevel = UIWindowLevelStatusBar,并没有将它设置为 keyWindow,非 keyWindow 不能接收键盘以及非触摸类的消息。UIWindow有三个层级,分别是Normal,StatusBar,Alert,级别依次增高,级别高的会显示在上面,级别低的在下面。

progressView 和 topBar 都被添加在 self.overlayWindow.rootViewController.view 中。而 rootViewController 其实就是被隐藏的 JDStatusBarNotificationViewController

dismissTimer 用于设置通知自动消失的时间,使用 NSRunLoop 的方法来设置 Timer。需要留意的是,在 - (UIView*)showWithStatus:(NSString *)status style:(JDStatusBarStyle*)style 方法中(所有 show 方法最终都会调用到它)使用了 [[NSRunLoop currentRunLoop] cancelPerformSelector:@selector(dismiss) target:self argument:nil]; 来关闭了当前的定时器。

JDStatusBarNotification 本身会持有一个 userStyles 的字典。key 和 value 分别为 JDStatusStyle 的 name(NSString) 和 Style 对象。默认有以下五种 Style: @[JDStatusBarStyleError, JDStatusBarStyleWarning, JDStatusBarStyleSuccess, JDStatusBarStyleMatrix, JDStatusBarStyleDark, JDStatusBarStyleDefault] 。

self.defaultStyle 在 JDStatusBarNotification 实例化之后是 JDStatusBarStyleDefault 类型。当我们使用 +(NSString*)addStyleNamed:(NSString*)identifier prepare:(JDPrepareStyleBlock)prepareBlock 方法的时候,Notification 会将 defaultStyle 复制一份,然后使用 block 中修改的方法,再保存到 userStyles 字典中去。

- (NSString*)addStyleNamed:(NSString*)identifier
                   prepare:(JDPrepareStyleBlock)prepareBlock;
{
  NSAssert(identifier != nil, @"No identifier provided");
  NSAssert(prepareBlock != nil, @"No prepareBlock provided");

  JDStatusBarStyle *style = [self.defaultStyle copy];
  [self.userStyles setObject:prepareBlock(style) forKey:identifier];
  return identifier;
}

activeStyle 是指当前 JDStatusBarNotification 正在使用的 Style。当我们使用 + (UIView*)showWithStatus:(NSString *)status styleName:(NSString*)styleName; 时,就从 userStyles 字典中取出 JDStatusBarStyle 来,保存到 activeStyle 。

JDStatusBarView

JDStatusBarView 是 JDStatusBarNotification 内容显示的主要 UIView,包括一个 UILabel 和 UIActivityIndicatorView。

JDStatusBarStyle

JDStatusBarStyle 定义了一个 JDStatusBarNotification 的显示效果。属性比较多就不一一列举了。

JDStatusBarLayoutMarginHelper

JDStatusBarLayoutMarginHelper 并不是一个类,只是简单的写了一个返回 UIEdgeInsets 的函数(不是方法)。

查看原文: 源码阅读:JDStatusBarNotification

  • orangelion
  • orangedog
  • whitetiger
  • greensnake
  • browncat
需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。