由于項(xiàng)目的原因,簡(jiǎn)單的封裝了一個(gè)會(huì)話框,知名的有MBProgressHUD、DLHDActivityIndicator,使用的人都很多,以前的會(huì)話框都會(huì)覆蓋整個(gè)頁面,在會(huì)話框消失前,做不了任何操作,當(dāng)然啦,類似的會(huì)話框也有很多,我這個(gè)只是為了現(xiàn)在的項(xiàng)目(JOIN)所寫,約束是用Masonry,所以有需要的話還需要導(dǎo)入Masonry,下面來介紹一下KJDialogHUD:
BaseView
- 顯示模式
這里也考慮到兩種情況,一個(gè)是透明層會(huì)覆蓋整個(gè)SuperView,讓會(huì)話框在消失前,不允許有其它操作;一個(gè)是透明層不會(huì)覆蓋整個(gè)SuperView,只按照指定的樣式進(jìn)行顯示
typedef NS_ENUM(NSInteger, KJDialogBaseMode) {
KJDialogBaseNone = 0, //內(nèi)容居中展示,該模式下,透明層不會(huì)覆蓋superView,可以設(shè)置kjDistance來改變centerY
KJDialogBaseTop, //內(nèi)容緊靠頂部展示,該模式下,透明層不會(huì)覆蓋superView,可以設(shè)置kjDistance來改變頂部距離
KJDialogBaseBottom, //內(nèi)容緊靠底部展示,該模式下,透明層不會(huì)覆蓋superView,可以設(shè)置kjDistance來改變頂部距離
KJDialogBaseFull, //內(nèi)容居中展示,該模式下,透明層會(huì)覆蓋整個(gè)superView,可以設(shè)置kjDistance來改變centerY
KJDialogBaseFull_t, //內(nèi)容緊靠頂部展示,該模式下,透明層會(huì)覆蓋superView,可以設(shè)置kjDistance來改變底部距離
KJDialogBaseFull_b, //內(nèi)容緊靠底部展示,該模式下,透明層會(huì)覆蓋superView,可以設(shè)置kjDistance來改變底部距離
};
- 動(dòng)畫展示
這里也內(nèi)置了幾個(gè)簡(jiǎn)單的動(dòng)畫效果:
typedef NS_ENUM(NSInteger, KJAnimationShowMode) {
KJAnimationNone = 0, //無動(dòng)畫效果
KJAnimationShake, //搖動(dòng)、抖動(dòng)
KJAnimationHeartbeat, //心跳
KJAnimationMoveLeft, //從左到右移動(dòng)
KJAnimationMoveRight, //從右到左移動(dòng)
KJAnimationMoveTop, //從上到下移動(dòng)
KJAnimationMoveBottom //從下到上移動(dòng)
};
當(dāng)然啦,這些動(dòng)畫對(duì)于肯定是不會(huì)滿足各種要求的項(xiàng)目,這里也有給出由外部提供動(dòng)畫的方法:
/**設(shè)置展示的時(shí)間,默認(rèn)是一直展示,
當(dāng)該值>0時(shí),就會(huì)在該時(shí)間后會(huì)自動(dòng)消失
當(dāng)該值<=0時(shí),就不會(huì)自動(dòng)消失,需要主動(dòng)調(diào)用kjHiddenFromSuperView來讓其消失
*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds;
/**動(dòng)畫展示-內(nèi)置簡(jiǎn)單動(dòng)畫KJAnimationShowMode*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
kjAnimation:(KJAnimationShowMode)kjAnimation;
/**動(dòng)畫展示-由外部自定義動(dòng)畫*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
customAnimation:(void (^) (UIView *kjView))kjAnimation;
下面完整的貼出BaseView的h文件,其實(shí)剛開始在設(shè)計(jì)的時(shí)候,由于只考慮到現(xiàn)在的項(xiàng)目,在后續(xù)為了適配大多數(shù)項(xiàng)目需求的時(shí)候,重新修改了,但是也多出很多沒必要的方法,其實(shí)外部可以通過對(duì)象能非常自由的自定義:
//
// 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, //內(nèi)容居中展示,該模式下,透明層不會(huì)覆蓋superView,可以設(shè)置kjDistance來改變centerY
KJDialogBaseTop, //內(nèi)容緊靠頂部展示,該模式下,透明層不會(huì)覆蓋superView,可以設(shè)置kjDistance來改變頂部距離
KJDialogBaseBottom, //內(nèi)容緊靠底部展示,該模式下,透明層不會(huì)覆蓋superView,可以設(shè)置kjDistance來改變頂部距離
KJDialogBaseFull, //內(nèi)容居中展示,該模式下,透明層會(huì)覆蓋整個(gè)superView,可以設(shè)置kjDistance來改變centerY
KJDialogBaseFull_t, //內(nèi)容緊靠頂部展示,該模式下,透明層會(huì)覆蓋superView,可以設(shè)置kjDistance來改變底部距離
KJDialogBaseFull_b, //內(nèi)容緊靠底部展示,該模式下,透明層會(huì)覆蓋superView,可以設(shè)置kjDistance來改變底部距離
};
typedef NS_ENUM(NSInteger, KJAnimationShowMode) {
KJAnimationNone = 0, //無動(dòng)畫效果
KJAnimationShake, //搖動(dòng)、抖動(dòng)
KJAnimationHeartbeat, //心跳
KJAnimationMoveLeft, //從左到右移動(dòng)
KJAnimationMoveRight, //從右到左移動(dòng)
KJAnimationMoveTop, //從上到下移動(dòng)
KJAnimationMoveBottom //從下到上移動(dòng)
};
/**初始化*/
- (instancetype)initSuperView:(UIView *)sView;
/**內(nèi)容背景View*/
@property (strong, nonatomic) UIView *kjBaseView;
/**設(shè)置內(nèi)容背景顏色 默認(rèn)為blackColor*/
@property (nonatomic) UIColor *kjBaseColor;
/**設(shè)置內(nèi)容背景圓角 默認(rèn)是4*/
@property (assign, nonatomic) CGFloat kjRadius;
/**配合KJDialogBaseMode,設(shè)置自定義約束,
當(dāng)為KJDialogBaseNone或KJDialogBaseFull時(shí),該值區(qū)分正負(fù)值,其它模式下不區(qū)分正負(fù)值(取絕對(duì)值),
默認(rèn)為0
*/
@property (assign, nonatomic) CGFloat kjDistance;
/**設(shè)置覆蓋樣式 默認(rèn)None*/
@property (assign, nonatomic) KJDialogBaseMode kjBaseMode;
/**設(shè)置展示的時(shí)間,默認(rèn)是一直展示,
當(dāng)該值>0時(shí),就會(huì)在該時(shí)間后會(huì)自動(dòng)消失
當(dāng)該值<=0時(shí),就不會(huì)自動(dòng)消失,需要主動(dòng)調(diào)用kjHiddenFromSuperView來讓其消失
*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds;
/**動(dòng)畫展示-內(nèi)置簡(jiǎn)單動(dòng)畫KJAnimationShowMode*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
kjAnimation:(KJAnimationShowMode)kjAnimation;
/**動(dòng)畫展示-由外部自定義動(dòng)畫*/
- (void)kjShowTime:(NSTimeInterval)kjSeconds
customAnimation:(void (^) (UIView *kjView))kjAnimation;
/**外部調(diào)用隱藏,當(dāng)時(shí)間設(shè)置為<=0時(shí),是不會(huì)自動(dòng)隱藏的,需要調(diào)用該方法進(jìn)行隱藏*/
+ (void)kjHiddenFromSuperView:(UIView *)kjSuperV;
@end
下面只介紹其中一個(gè)子類,在我現(xiàn)在的項(xiàng)目(JOIN)中,有很多類似微博主頁的效果,就是多個(gè)UITableViewController,Child到一個(gè)主控制器中,主控制器頭部是下拉放大,導(dǎo)致子控制器不能有下拉刷新的效果,但是又要各自控制器都有刷新的提示,這也是有這個(gè)會(huì)話框子類的由來:
KJDialogActivityText
這里給出了四種模式,Activity在上下左右的不同方向,導(dǎo)致約束不一樣,其實(shí)和BaseView的想法是一樣的,由于開始的設(shè)計(jì)沒考慮到其它項(xiàng)目,所以對(duì)于后續(xù)的修改,多出了很多沒必要的屬性設(shè)置,不過我也沒刪除,大家看了也會(huì)動(dòng),下面直接給出h文件內(nèi)容:
//
// 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;
/**設(shè)置文字和Activity之間的間隔 >0的值
KJDialogActivityLeft|KJDialogActivityRight 默認(rèn)是5
KJDialogActivityTop|KJDialogActivityBottom 默認(rèn)是10
*/
@property (assign, nonatomic) CGFloat kjSpace;
/**設(shè)置Activity顏色*/
@property (strong, nonatomic) UIColor *kjActivityColor;
/**設(shè)置Activity方向 默認(rèn)KJDialogActivityLeft*/
@property (assign, nonatomic) KJDialogActivityDirection kjDirection;
/**設(shè)置內(nèi)容最小高度(同時(shí)也是固定的寬度),
只有在KJDialogActivityTop|KJDialogActivityBottom模式下有效,
默認(rèn)是120 必須是>0的值*/
@property (assign, nonatomic) CGFloat kjMinHeight;
@end
注釋都寫的很清楚,感覺沒什么需要特別說明的,其實(shí)還有另外兩個(gè)子類KJDialogPureText、KJDialogImageText,看名字就知道作用了,代碼就不再貼出了。
下面就說說使用:
這里也只是給出各種子類的其中一種使用方法,其它的使用設(shè)置相關(guān)的屬性即可。
- 純文本
/**展示文本提示框 放置在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上,并覆蓋整個(gè)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];
}
記得哦 ,使用需要導(dǎo)入Masonry
由于設(shè)計(jì)剛開始的時(shí)候是為了現(xiàn)在的項(xiàng)目使用,后續(xù)的修改再讓其能使用在大多數(shù)項(xiàng)目,當(dāng)然啦,寫的也沒多復(fù)雜,也沒有那么多炫酷的特效,不喜歡勿噴,謝謝~
希望能幫助到大家!
https://github.com/hkjin/KJDialogHUD