iOS开发-DialogHUD会话框/提示框

由于项目的原因,简单的封装了一个会话框,知名的有MBProgressHUDDLHDActivityIndicator,使用的人都很多,以前的会话框都会覆盖整个页面,在会话框消失前,做不了任何操作,当然啦,类似的会话框也有很多,我这个只是为了现在的项目(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

注释都写的很清楚,感觉没什么需要特别说明的,其实还有另外两个子类KJDialogPureTextKJDialogImageText,看名字就知道作用了,代码就不再贴出了。
下面就说说使用:
这里也只是给出各种子类的其中一种使用方法,其它的使用设置相关的属性即可。

  • 纯文本
/**展示文本提示框 放置在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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容