iOS 你需要的彈窗大全

在我們的實際開發(fā)項目中黍匾,彈窗是必不可少的栏渺,很多時候我們用的是系統(tǒng)的AlertViewController,但是實際情況中锐涯,并不能滿足我們的開發(fā)需求磕诊,這個時候我們需要的就是自定義自己的彈窗效果。接下來我會寫一些自己的所封裝的彈窗效果纹腌。包括代理delegate回調(diào)霎终,block 回調(diào),xib新建view來創(chuàng)建我們需要的彈窗效果升薯。

官方思路

1.在我們自己動手之前一定要先看看官方是怎么封裝的莱褒,這樣我們寫出來的代碼才接近蘋果語言,看起來高大上涎劈。好的代碼一定是見名知意的广凸,別人一看這個方法就知道大概我們通過這個方法可以得到什么樣的效果。

// ios8.0 之后
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"確定");
    }];
    
    [alertController addAction:cancelAction];
    [alertController addAction:okAction];
    [self presentViewController:alertController animated:YES completion:nil];
// ios8.0 之前
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Tittle" message:@"This is message" delegate:self 
cancelButtonTitle:@"cancel" otherButtonTitles:nil, nil];
[alertView show];

因為在代碼量風(fēng)格上责语,我還是比較喜歡老版本的彈窗炮障,畢竟代碼上啊目派,一句話調(diào)用美滋滋坤候。所以接下來我們封裝也是模仿官方開始.....

delegate

我們可以看到在蘋果官方中,我們需要通過識別用戶點擊某個按鈕來確定需要進一步的操作事件企蹭,這個時候是通過代理來實現(xiàn)的白筹。代理的話智末,我們在熟悉不過了。

  1. 首先申明協(xié)議
#pragma mark - 協(xié)議
@class HLAlertView;
@protocol HLAlertViewDelegate<NSObject>
- (void)alertViewDidClickButtonWithIndex:(NSInteger)index;
@end
  1. 在viewController中遵循代理徒河,設(shè)置代理 系馆, 實現(xiàn)方法即可
<HLAlertViewDelegate>
self.delegate = self;

#pragma mark --- HLAlertViewDelegate
-(void)alertViewDidClickButtonWithIndex:(NSInteger)index{
    if (index == AlertSureButtonClick) {
        [self alertSureButtonClick];
    }else{
        [self alertCauseButtonClick];
    }
}
  1. 接下來就是實現(xiàn)我們封裝類的.h文件方法申明,以及.m的實現(xiàn)方法
//.h 文件
#import <UIKit/UIKit.h>

typedef enum : NSUInteger {
    AlertCauseButtonClick = 0,
    AlertSureButtonClick
} AlertButtonClickIndex;

#pragma mark - 協(xié)議
@class HLAlertView;
@protocol HLAlertViewDelegate<NSObject>
- (void)alertViewDidClickButtonWithIndex:(NSInteger)index;
@end
@interface HLAlertView : UIView

@property(nonatomic, weak) id <HLAlertViewDelegate> delegate;

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message sureButton:(NSString *)sureBtn;
- (void)show;

@end
@interface HLAlertView()

/** 彈窗主內(nèi)容view */
@property (nonatomic,strong) UIView   *contentView;

/** 彈窗標題 */
@property (nonatomic,copy)   NSString *title;

/** message */
@property (nonatomic,copy)   NSString *message;

/** 確認按鈕 */
@property (nonatomic,copy)   UIButton *sureButton;

@end


@implementation HLAlertView

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message sureButton:(NSString *)sureBtn{
    
    if (self = [super init]) {
        self.title = tittle;
        self.message = message;
        
        [self sutUpView];
    }
    return self;
}

- (void)sutUpView{
    self.frame = [UIScreen mainScreen].bounds;
    self.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.85];
    [UIView animateWithDuration:0.5 animations:^{
        self.alpha = 1;
    }];
    
    //------- 彈窗主內(nèi)容 -------//
    self.contentView = [[UIView alloc]init];
    self.contentView.frame = CGRectMake(0, 0, SCREEN_WIDTH - 80, 150);
    self.contentView.center = self.center;
    self.contentView.backgroundColor = [UIColor whiteColor];
    self.contentView.layer.cornerRadius = 6;
    [self addSubview:self.contentView];
    
    // 標題
    UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, self.contentView.width, 22)];
    titleLabel.font = [UIFont boldSystemFontOfSize:20];
    titleLabel.textAlignment = NSTextAlignmentCenter;
    titleLabel.text = self.title;
    [self.contentView addSubview:titleLabel];
    
    // message
    UILabel *messageLable = [[UILabel alloc]initWithFrame:CGRectMake(0, 50, self.contentView.width, 22)];
    messageLable.font = [UIFont boldSystemFontOfSize:17];
    messageLable.textAlignment = NSTextAlignmentCenter;
    messageLable.text = self.message;
    [self.contentView addSubview:messageLable];
    
    
    // 取消按鈕
    UIButton * causeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    causeBtn.frame = CGRectMake(0, self.contentView.height - 40, self.contentView.width/2, 40);
    causeBtn.backgroundColor = [UIColor grayColor];
    [causeBtn setTitle:@"取消" forState:UIControlStateNormal];
    [causeBtn addTarget:self action:@selector(causeBtn:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:causeBtn];
    
    // 確認按鈕
    UIButton * sureButton = [UIButton buttonWithType:UIButtonTypeCustom];
    sureButton.frame = CGRectMake(causeBtn.width, causeBtn.y, causeBtn.width, 40);
    sureButton.backgroundColor = [UIColor redColor];
    [sureButton setTitle:@"確定" forState:UIControlStateNormal];
    [sureButton addTarget:self action:@selector(processSure:) forControlEvents:UIControlEventTouchUpInside];
    
    [self.contentView addSubview:sureButton];
    
}

- (void)show{
    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    [keyWindow addSubview:self];
}


- (void)processSure:(UIButton *)sender{
    if ([self.delegate respondsToSelector:@selector(alertViewDidClickButtonWithIndex:)]) {
        [self.delegate alertViewDidClickButtonWithIndex:AlertSureButtonClick];
    }
    [self dismiss];
}

- (void)causeBtn:(UIButton *)sender{

    if ([self.delegate respondsToSelector:@selector(alertViewDidClickButtonWithIndex:)]) {
        [self.delegate alertViewDidClickButtonWithIndex:AlertCauseButtonClick];
    }
    [self dismiss];
}

#pragma mark - 移除此彈窗
/** 移除此彈窗 */
- (void)dismiss{
    [self removeFromSuperview];
}

通過代理的方式我們就完成了我們自己頁面的封裝了顽照。

block彈窗

先看一下封裝之后我們的調(diào)用方式吧:

HLAlertViewBlock * alertView = [[HLAlertViewBlock alloc] initWithTittle:@"提示" message:@"通過Block彈窗回調(diào)的彈窗" block:^(NSInteger index) {
        if (index == AlertSureButtonClick) {
            [self alertSureButtonClick];
        }else{
            [self alertCauseButtonClick];
        }
    }];
    [alertView show];

相比代理的方式的話由蘑,我們還行喜歡這種block回調(diào)的,簡大氣接地氣啊代兵。當然在我們需要處理邏輯多的時候尼酿,還是代理會比較好一點美澳,具體環(huán)境下具體使用笨农。
封裝成block的好處就是在我們構(gòu)造方法的時候就可以實現(xiàn)我們將來的點擊方法,所以在自定義彈窗類的.h文件中斯碌,我們要申明block屬性思币。代碼

//.h
@interface HLAlertViewBlock : UIView

@property(nonatomic, copy) void (^buttonBlock) (NSInteger index);

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message block:(void (^) (NSInteger index))block;

- (void)show;

@end

//.m
@interface HLAlertViewBlock()

/** 彈窗主內(nèi)容view */
@property (nonatomic,strong) UIView   *contentView;

/** 彈窗標題 */
@property (nonatomic,copy)   NSString *title;

/** message */
@property (nonatomic,copy)   NSString *message;

/** 確認按鈕 */
@property (nonatomic,copy)   UIButton *sureButton;

@end


@implementation HLAlertViewBlock

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message block:(void (^)(NSInteger))block{
    if (self = [super init]) {
        self.title = tittle;
        self.message = message;
        self.buttonBlock = block;
        [self sutUpView];
    }
    return self;
}

到此為止鹿响,我們的block彈窗申明方法也搞定了。

xib的封裝彈窗

圖片.png

好處就是不用寫界面代碼了谷饿。

殊途同歸

還有一種實現(xiàn)彈窗效果的方法惶我,不通過新建view而是Controller來實現(xiàn)的,就是新建一個透明的控制器博投。代碼如下

    PopViewController * popVC = [[PopViewController alloc] init];
    UIColor * color = [UIColor blackColor];
    popVC.view.backgroundColor = [color colorWithAlphaComponent:0.85];
    popVC.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    [self presentViewController:popVC animated:NO completion:nil];

更加簡單指孤,邏輯也更加好處理一些。
最后附上demo地址:gibHub地址:https://github.com/MrBMask

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贬堵,一起剝皮案震驚了整個濱河市恃轩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黎做,老刑警劉巖叉跛,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒸殿,居然都是意外死亡筷厘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門宏所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酥艳,“玉大人,你說我怎么就攤上這事爬骤〕涫” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵霞玄,是天一觀的道長骤铃。 經(jīng)常有香客問我拉岁,道長,這世上最難降的妖魔是什么惰爬? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任喊暖,我火速辦了婚禮,結(jié)果婚禮上撕瞧,老公的妹妹穿的比我還像新娘陵叽。我一直安慰自己,他們只是感情好丛版,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布咨跌。 她就那樣靜靜地躺著,像睡著了一般硼婿。 火紅的嫁衣襯著肌膚如雪锌半。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天寇漫,我揣著相機與錄音刊殉,去河邊找鬼。 笑死州胳,一個胖子當著我的面吹牛记焊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栓撞,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼遍膜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓤湘?” 一聲冷哼從身側(cè)響起瓢颅,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弛说,沒想到半個月后挽懦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡木人,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年信柿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醒第。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡渔嚷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稠曼,到底是詐尸還是另有隱情形病,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站窒朋,受9級特大地震影響搀罢,放射性物質(zhì)發(fā)生泄漏蝗岖。R本人自食惡果不足惜侥猩,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抵赢。 院中可真熱鬧欺劳,春花似錦、人聲如沸铅鲤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邢享。三九已至鹏往,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骇塘,已是汗流浹背伊履。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留款违,地道東北人唐瀑。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像插爹,于是被迫代替她去往敵國和親哄辣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1赠尾、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評論 3 119
  • 外面的世界在下雪气嫁,我望向窗外不見枯枝披上新衣睛廊。我在的地方為什么不下雪?可我的心里已經(jīng)飄滿了白雪杉编,還好這里溫暖如春超全。
    葛志力閱讀 238評論 0 0
  • “自己真正想去做的時候光酣,產(chǎn)生的力量才是無窮的疏遏。稻盛會長深知這一點。在開發(fā)新產(chǎn)品的時候,他曾召集所有事業(yè)部長問道:‘...
    拾貝坊玥彤閱讀 277評論 0 0
  • 2018-2-1 晴 星期四 親子日記第130篇 今天是二月的第一天财异,是我們核算考勤的日子倘零,今天又逢周四,公司每周...
    敏文媽咪閱讀 219評論 0 2
  • 文/陳安若 剛搬完家的小宇很累很累,躺在新屋子的床上沉沉睡去疫鹊。 不知過了多久袖瞻,聽到外面鳥叫聲聲,醒來拆吆,卻發(fā)現(xiàn)自己躺...
    陳安若閱讀 1,272評論 15 11