iOS 自定義一個帶有倒計時的彈出框

有時我們可能會有這么一種需求扫尖,就是當用戶第一次進入app會有比較重要的信息提示希望用戶仔細看一下,如果只是一個彈出框加上一個刪除或者確定按鈕语盈,用戶往往不會去閱讀提示的內(nèi)容搀缠,這樣我們就可以在確認按鈕加上倒計時,這樣就會讓用戶感覺提示的信息應(yīng)該比較重要目溉,當?shù)褂嫊r結(jié)束才能刪除或者確認明肮。說了這么多其實功能有點類似啟動頁廣告。先看一下需要的效果:

效果圖

大致的樣子就是這樣缭付,當然實現(xiàn)也不難柿估,下面我們先看一下大致的控件,整體上來看就是自定義一個view陷猫,然后添加到window上就可以秫舌,這個view背景可以是button這樣我們就可以設(shè)置點擊事件,也可以是view绣檬,雖然我們的需求是不允許點擊足陨,但是自己還是用的button,而view上就是label+橫線(可用label娇未,view實現(xiàn)但注意一像素的設(shè)置)+高度不定的label+button+倒計時墨缘,整體上就是這樣。下面就一步一步去實現(xiàn)。
首先我們先創(chuàng)建一個view镊讼,當然我們我已用xib提高開發(fā)效率宽涌,這里我用的代碼,先自定義一個初始化方法蝶棋,然后再創(chuàng)建需要的控件:

- (instancetype)initWithTitle:(NSString *)title messages:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle {
    self = [super init];
    if (self) {
        _titles = title;
        _message = message;
        _cancelTitle = cancelButtonTitle;
        self.backgroundColor = [UIColor whiteColor];
        self.alpha = 0;
        self.layer.masksToBounds = YES;
        self.layer.cornerRadius = 5.0;
    }
    return self;
}

在里面給view設(shè)置背景顏色卸亮,透明度等。
先來創(chuàng)建背景按鈕玩裙,并且設(shè)置好相應(yīng)的屬性:

//添加背景
-(void)addBack {
    self.btnBack = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, ScreenWd, ScreenHt)];
    self.btnBack.backgroundColor = [UIColor blackColor];
    [self.btnBack addTarget:self action:@selector(gotoBackBtnClick:) forControlEvents:UIControlEventTouchUpInside];
    self.btnBack.alpha = 0;
}
//點擊背景按鈕
- (void)gotoBackBtnClick:(UIButton *)btn{
    NSLog(@"點擊背景");
}

設(shè)置標題兼贸,這里使用懶加載的方式:

//添加頭部提示
- (UILabel *)labTitle {
    if (!_labTitle) {
        _labTitle = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, ScreenWd-80, 20)];
        _labTitle.textAlignment = NSTextAlignmentCenter;
        _labTitle.text = _titles;
    }
    return _labTitle;
}

設(shè)置橫線,我這里使用的是一高度献酗,如果想設(shè)置為1像素寝受,我們可以這樣設(shè)置(參考:如何正確的繪制1像素的線):

//添加橫線
- (UIImageView *)imgLine {
    if (!_imgLine) {
        _imgLine = [[UIImageView alloc] initWithFrame:CGRectMake(20, CGRectGetMaxY(self.labTitle.frame)+10, ScreenWd-80, 1)];
        _imgLine.backgroundColor = [UIColor colorWithWhite:0.925 alpha:1.000];
    }
    return _imgLine;
}

接下來的label需要計算行高:

//添加內(nèi)容
- (UILabel *)labMessage {
    if (!_labMessage) {
        _labMessage = [[UILabel alloc] init];
        _labMessage.textColor = [UIColor colorWithWhite:0.259 alpha:1.000];
        _labMessage.textAlignment = NSTextAlignmentCenter;
        _labMessage.numberOfLines = 0;
        _labMessage.text = _message;
        _labMessage.font = FontSize;
        NSDictionary *attrs = @{NSFontAttributeName : FontSize};
        CGRect messageSize = [_message boundingRectWithSize:CGSizeMake(ScreenWd-80, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil];
        _labMessage.frame = CGRectMake(20, CGRectGetMaxY(self.imgLine.frame)+10, ScreenWd-80, messageSize.size.height);
    }
    return _labMessage;
}

最后就是button的設(shè)置,要注意坐標的計算:

//添加確定
- (UIButton *)cancelButton {
    if (!_cancelButton) {
        _cancelButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _cancelButton.backgroundColor = [UIColor colorWithWhite:0.976 alpha:1.000];
        _cancelButton.layer.masksToBounds = YES;
        _cancelButton.layer.cornerRadius = 3.0;
        _cancelButton.layer.borderWidth = 1.0;
        _cancelButton.layer.borderColor = [UIColor colorWithWhite:0.875 alpha:1.000].CGColor;
        [_cancelButton setTitle:_cancelTitle forState:UIControlStateNormal];
        [_cancelButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        _cancelButton.titleLabel.font = FontSize;
        [_cancelButton addTarget:self action:@selector(gotoCancelButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        _cancelButton.frame = CGRectMake(20, CGRectGetMaxY(self.labMessage.frame)+10, ScreenWd-80, 30);
        
    }
    return _cancelButton;
}

然后根據(jù)之前寫的倒計時罕偎,直接加上就可以了:

- (UIButton *)cancelButton {
    if (!_cancelButton) {
        [CJXTimer initWithGCD:3 beginState:^(int seconds){
            [_cancelButton setTitle:[NSString stringWithFormat:@"請認真閱讀(%.2d)", seconds] forState:UIControlStateNormal];
            _cancelButton.userInteractionEnabled = NO;
        } endState:^{
            //設(shè)置按鈕的樣式
            [_cancelButton setTitle:_cancelTitle forState:UIControlStateNormal];
            _cancelButton.userInteractionEnabled = YES;
        }];
        _cancelButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _cancelButton.backgroundColor = [UIColor colorWithWhite:0.976 alpha:1.000];
        _cancelButton.layer.masksToBounds = YES;
        _cancelButton.layer.cornerRadius = 3.0;
        _cancelButton.layer.borderWidth = 1.0;
        _cancelButton.layer.borderColor = [UIColor colorWithWhite:0.875 alpha:1.000].CGColor;
        [_cancelButton setTitle:_cancelTitle forState:UIControlStateNormal];
        [_cancelButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        _cancelButton.titleLabel.font = FontSize;
        [_cancelButton addTarget:self action:@selector(gotoCancelButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        _cancelButton.frame = CGRectMake(20, CGRectGetMaxY(self.labMessage.frame)+10, ScreenWd-80, 30);
        
    }
    return _cancelButton;
}

然后給view設(shè)置位置,位置可以直接在引用的時候設(shè)置京闰,但是感覺那樣不是很好颜及,所以直接在這里設(shè)置bounds:

    self.bounds = CGRectMake(0, 0, ScreenWd - 40, CGRectGetMaxY(self.cancelButton.frame)+10);
    self.center = CGPointMake(ScreenWd/2, ScreenHt/2);
    [BaseWindow addSubview:self];

然后再設(shè)置彈出和消失動畫效果以便以后引用:

- (void)show {
    self.bounds = CGRectMake(0, 0, ScreenWd - 40, CGRectGetMaxY(self.cancelButton.frame)+10);
    self.center = CGPointMake(ScreenWd/2, ScreenHt/2);
    [BaseWindow addSubview:self.btnBack];
    [BaseWindow addSubview:self];
    [UIView animateWithDuration:0.3 animations:^{
        self.btnBack.alpha = 0.4;
        self.alpha = 1.0;
    }];
}
/**
 *  視圖隱藏
 */
- (void)dismiss{
    [UIView animateWithDuration:0.3 animations:^{
        self.btnBack.alpha = 0;
        self.alpha = 0;
    }completion:^(BOOL finished) {
        [self.btnBack removeFromSuperview];
        [self removeFromSuperview];
    }];
}

最后我們測試一下:

- (IBAction)popView:(id)sender {
    CJXAlertView *cjxView = [[CJXAlertView alloc]initWithTitle:@"提示" messages:@"注意啦!注意啦蹂楣!這里的消息很重要俏站。塞納河畔 左岸的咖啡 我手一杯 品嘗你的美 留下唇印的嘴 花店玫瑰 名字寫錯誰 告白氣球 風吹到對街 微笑在天上飛 你說你有點難追 想讓我知難而退 禮物不需挑最貴 只要香榭的落葉 喔 營造浪漫的約會 不害怕搞砸一切 擁有你就擁有 全世界 親愛的 愛上你 從那天起 甜蜜的很輕易 親愛的 別任性 你的眼睛 在說我愿意"cancelButtonTitle:@"確定"];
    [cjxView show];
}

正如預期的效果,如果感覺哪里不合適可以再調(diào)整一下痊土。當然如果需要其他樣式也可以這樣一步一步設(shè)置肄扎,我這里封裝的不算太好,因為需求的原因赁酝,沒有做其他按鈕的設(shè)置犯祠,但是這樣基本可以滿足需求了。
我是Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酌呆,一起剝皮案震驚了整個濱河市衡载,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隙袁,老刑警劉巖痰娱,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異菩收,居然都是意外死亡梨睁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門娜饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坡贺,“玉大人,你說我怎么就攤上這事∷┠睿” “怎么了钧萍?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長政鼠。 經(jīng)常有香客問我风瘦,道長,這世上最難降的妖魔是什么公般? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任万搔,我火速辦了婚禮,結(jié)果婚禮上官帘,老公的妹妹穿的比我還像新娘瞬雹。我一直安慰自己,他們只是感情好刽虹,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布酗捌。 她就那樣靜靜地躺著,像睡著了一般涌哲。 火紅的嫁衣襯著肌膚如雪胖缤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天阀圾,我揣著相機與錄音哪廓,去河邊找鬼。 笑死初烘,一個胖子當著我的面吹牛涡真,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肾筐,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼哆料,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了局齿?” 一聲冷哼從身側(cè)響起剧劝,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抓歼,沒想到半個月后讥此,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡谣妻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年萄喳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹋半。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡他巨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情染突,我是刑警寧澤捻爷,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站份企,受9級特大地震影響也榄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜司志,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一甜紫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骂远,春花似錦囚霸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘸恼,卻和暖如春吨述,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞脂。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捕儒,地道東北人冰啃。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像刘莹,于是被迫代替她去往敵國和親阎毅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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