iOS開發(fā)-DialogHUD會(huì)話框/提示框

由于項(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容