由于项目的原因,简单的封装了一个会话框,知名的有MBProgressHUD
、DLHDActivityIndicator
,使用的人都很多,以前的会话框都会覆盖整个页面,在会话框消失前,做不了任何操作,当然啦,类似的会话框也有很多,我这个只是为了现在的项目(JOIN)所写,约束是用Masonry
,所以有需要的话还需要导入Masonry
,下面来介绍一下KJDialogHUD
:
BaseView
- 显示模式
这里也考虑到两种情况,一个是透明层会覆盖整个SuperView,让会话框在消失前,不允许有其它操作;一个是透明层不会覆盖整个SuperView,只按照指定的样式进行显示
typedef NS_ENUM(NSInteger, KJDialogBaseMode) {
KJDialogBaseNone = 0, //内容居中展示,该模式下,透明层不会覆盖superView,可以设置kjDistance来改变centerY
KJDialogBaseTop, //内容紧靠顶部展示,该模式下,透明层不会覆盖superView,可以设置kjDistance来改变顶部距离
KJDialogBaseBottom, //内容紧靠底部展示,该模式下,透明层不会覆盖superView,可以设置kjDistance来改变顶部距离
KJDialogBaseFull, //内容居中展示,该模式下,透明层会覆盖整个superView,可以设置kjDistance来改变centerY
KJDialogBaseFull_t, //内容紧靠顶部展示,该模式下,透明层会覆盖superView,可以设置kjDistance来改变底部距离
KJDialogBaseFull_b, //内容紧靠底部展示,该模式下,透明层会覆盖superView,可以设置kjDistance来改变底部距离
};
- 动画展示
这里也内置了几个简单的动画效果:
typedef NS_ENUM(NSInteger, KJAnimationShowMode) {
KJAnimationNone = 0, //无动画效果
KJAnimationShake, //摇动、抖动
KJAnimationHeartbeat, //心跳
KJAnimationMoveLeft, //从左到右移动
KJAnimationMoveRight, //从右到左移动
KJAnimationMoveTop, //从上到下移动
KJAnimationMoveBottom //从下到上移动
};
当然啦,这些动画对于肯定是不会满足各种要求的项目,这里也有给出由外部提供动画的方法:
/**设置展示的时间,默认是一直展示,
当该值>0时,就会在该时间后会自动消失
当该值<=0时,就不会自动消失,需要主动调用kjHiddenFromSuperView来让其消失
*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds;
/**动画展示-内置简单动画KJAnimationShowMode*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
kjAnimation:(KJAnimationShowMode)kjAnimation;
/**动画展示-由外部自定义动画*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
customAnimation:(void (^) (UIView *kjView))kjAnimation;
下面完整的贴出BaseView的h文件,其实刚开始在设计的时候,由于只考虑到现在的项目,在后续为了适配大多数项目需求的时候,重新修改了,但是也多出很多没必要的方法,其实外部可以通过对象能非常自由的自定义:
//
// KJDialogBaseView.h
// Join
//
// Created by JOIN iOS on 2018/7/19.
// Copyright © 2018年 huangkejin. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface KJDialogBaseView : UIView
typedef NS_ENUM(NSInteger, KJDialogBaseMode) {
KJDialogBaseNone = 0, //内容居中展示,该模式下,透明层不会覆盖superView,可以设置kjDistance来改变centerY
KJDialogBaseTop, //内容紧靠顶部展示,该模式下,透明层不会覆盖superView,可以设置kjDistance来改变顶部距离
KJDialogBaseBottom, //内容紧靠底部展示,该模式下,透明层不会覆盖superView,可以设置kjDistance来改变顶部距离
KJDialogBaseFull, //内容居中展示,该模式下,透明层会覆盖整个superView,可以设置kjDistance来改变centerY
KJDialogBaseFull_t, //内容紧靠顶部展示,该模式下,透明层会覆盖superView,可以设置kjDistance来改变底部距离
KJDialogBaseFull_b, //内容紧靠底部展示,该模式下,透明层会覆盖superView,可以设置kjDistance来改变底部距离
};
typedef NS_ENUM(NSInteger, KJAnimationShowMode) {
KJAnimationNone = 0, //无动画效果
KJAnimationShake, //摇动、抖动
KJAnimationHeartbeat, //心跳
KJAnimationMoveLeft, //从左到右移动
KJAnimationMoveRight, //从右到左移动
KJAnimationMoveTop, //从上到下移动
KJAnimationMoveBottom //从下到上移动
};
/**初始化*/
- (instancetype)initSuperView:(UIView *)sView;
/**内容背景View*/
@property (strong, nonatomic) UIView *kjBaseView;
/**设置内容背景颜色 默认为blackColor*/
@property (nonatomic) UIColor *kjBaseColor;
/**设置内容背景圆角 默认是4*/
@property (assign, nonatomic) CGFloat kjRadius;
/**配合KJDialogBaseMode,设置自定义约束,
当为KJDialogBaseNone或KJDialogBaseFull时,该值区分正负值,其它模式下不区分正负值(取绝对值),
默认为0
*/
@property (assign, nonatomic) CGFloat kjDistance;
/**设置覆盖样式 默认None*/
@property (assign, nonatomic) KJDialogBaseMode kjBaseMode;
/**设置展示的时间,默认是一直展示,
当该值>0时,就会在该时间后会自动消失
当该值<=0时,就不会自动消失,需要主动调用kjHiddenFromSuperView来让其消失
*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds;
/**动画展示-内置简单动画KJAnimationShowMode*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
kjAnimation:(KJAnimationShowMode)kjAnimation;
/**动画展示-由外部自定义动画*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
customAnimation:(void (^) (UIView *kjView))kjAnimation;
/**外部调用隐藏,当时间设置为<=0时,是不会自动隐藏的,需要调用该方法进行隐藏*/
+ (void)kjHiddenFromSuperView:(UIView *)kjSuperV;
@end
下面只介绍其中一个子类,在我现在的项目(JOIN)中,有很多类似微博主页的效果,就是多个UITableViewController,Child到一个主控制器中,主控制器头部是下拉放大,导致子控制器不能有下拉刷新的效果,但是又要各自控制器都有刷新的提示,这也是有这个会话框子类的由来:
KJDialogActivityText
这里给出了四种模式,Activity在上下左右的不同方向,导致约束不一样,其实和BaseView的想法是一样的,由于开始的设计没考虑到其它项目,所以对于后续的修改,多出了很多没必要的属性设置,不过我也没删除,大家看了也会动,下面直接给出h文件内容:
//
// KJDialogActivityText.h
// Join
//
// Created by JOIN iOS on 2018/7/24.
// Copyright © 2018年 huangkejin. All rights reserved.
//
#import "KJDialogBaseView.h"
@interface KJDialogActivityText : KJDialogBaseView
typedef NS_ENUM(NSInteger, KJDialogActivityDirection) {
KJDialogActivityLeft = 0, //activity在左,文字在右,该模式下是UIActivityIndicatorViewStyleWhite
KJDialogActivityRight, //activity在右,文字在左,该模式下是UIActivityIndicatorViewStyleWhite
KJDialogActivityTop, //activity在上,文字在下,该模式下是UIActivityIndicatorViewStyleWhiteLarge
KJDialogActivityBottom, //activity在下,文字在上,该模式下是UIActivityIndicatorViewStyleWhiteLarge
};
/**UIlabel*/
@property (strong, nonatomic) UILabel *kjLabel;
/**设置文字和Activity之间的间隔 >0的值
KJDialogActivityLeft|KJDialogActivityRight 默认是5
KJDialogActivityTop|KJDialogActivityBottom 默认是10
*/
@property (assign, nonatomic) CGFloat kjSpace;
/**设置Activity颜色*/
@property (strong, nonatomic) UIColor *kjActivityColor;
/**设置Activity方向 默认KJDialogActivityLeft*/
@property (assign, nonatomic) KJDialogActivityDirection kjDirection;
/**设置内容最小高度(同时也是固定的宽度),
只有在KJDialogActivityTop|KJDialogActivityBottom模式下有效,
默认是120 必须是>0的值*/
@property (assign, nonatomic) CGFloat kjMinHeight;
@end
注释都写的很清楚,感觉没什么需要特别说明的,其实还有另外两个子类KJDialogPureText
、KJDialogImageText
,看名字就知道作用了,代码就不再贴出了。
下面就说说使用:
这里也只是给出各种子类的其中一种使用方法,其它的使用设置相关的属性即可。
- 纯文本
/**展示文本提示框 放置在UIWindow上*/
+ (void)kjShowAllText:(NSString *)kjText {
KJDialogPureText *kjDialog = [[KJDialogPureText alloc] initSuperView:nil];
kjDialog.kjDistance = -49.0;
kjDialog.kjLabel.font = [UIFont systemFontOfSize:15.0];
kjDialog.kjLabel.text = kjText;
[kjDialog kjShowTime:2.5];
}
- Activity
/**展示Activity文本框,Activity在左|文本在右,放置在指定的UIView上*/
+ (void)kjShowLeftActFromText:(NSString *)kjText
sView:(UIView *)kjView {
KJDialogActivityText *kjDialog = [[KJDialogActivityText alloc] initSuperView:kjView];
kjDialog.kjDistance = -49.0;
kjDialog.kjLabel.font = [UIFont systemFontOfSize:15.0];
kjDialog.kjLabel.text = kjText;
[kjDialog kjShowTime:0];
}
- 图片
/**展示图片文本框,图片在上|文本在下,放置在指定的UIView上,并覆盖整个UIView*/
- (void)kjShowTopImgFromText:(NSString *)kjText
fullView:(UIView *)kjView {
KJDialogImageText *kjDialog = [[KJDialogImageText alloc] initSuperView:kjView];
kjDialog.kjDistance = -49.0;
kjDialog.kjDirection = KJDialogImageTop;
kjDialog.kjLabel.text = kjText;
kjDialog.kjLabel.font = [UIFont systemFontOfSize:15.0];
kjDialog.kjImgV.image = [UIImage imageNamed:@"imageName"];
[kjDialog kjShowTime:0];
}
记得哦 ,使用需要导入Masonry
由于设计刚开始的时候是为了现在的项目使用,后续的修改再让其能使用在大多数项目,当然啦,写的也没多复杂,也没有那么多炫酷的特效,不喜欢勿喷,谢谢~
希望能帮助到大家!
https://github.com/hkjin/KJDialogHUD