iOS 仿QQ导航栏提示 以及仿安卓Toast效果

最近因为项目需要,要实现一种导航栏提示的功能,为了偷懒就到网上搜索了下类似功能,后来发现不太好用,尤其是window.rootViewController改变后,加载在window上的提示窗就不会出现了,所以重点就是如何保证window的根视图切换还能够让弹窗出现。以下是自己整理的类似QQ导航提示效果,以及仿安卓toast效果,现在分享出来,欢迎大家批评指正。
仅需要两行代码搞定自己想要的效果,简单实用,直接上正餐:
SYToastView.h

//
//  SYToastView.h
//  SYToastView
//
//  Created by 紫竹 on 2017/7/14.
//  Copyright © 2017年 CSY. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface SYToastView : NSObject

/***  显示导航栏提醒  ***/
-(void)showNaviString:(NSString*)string;

/*** 导航点击事件 ***/
-(void)addTarget:(id)target action:(SEL)action;

/*** 底部toast 默认时间显示为3s ***/
+(void)showToastString:(NSString *)string;

/*** 底部toast  自定义显示时间***/
+ (void)showToastString:(NSString *)string showTime:(float)showTime;

@end

@interface ToastView : UILabel
+(ToastView*) sharedToastView;
@end


@interface CSYToastLabel : UILabel
+(CSYToastLabel*) sharedCSYToastLabel;
@end

SYToastView.m

//
//  SYToastView.m
//  SYToastView
//
//  Created by 紫竹 on 2017/7/14.
//  Copyright © 2017年 CSY. All rights reserved.
//

#import "SYToastView.h"
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
@interface SYToastView ()
@property (nonatomic,assign)id  target;
@property (nonatomic,assign)SEL action;
@property (nonatomic,strong)ToastView * toastView;
@end
@implementation SYToastView

/***  显示导航栏提醒  ***/
-(void)showNaviString:(NSString *)string{
    if (![[NSThread currentThread] isMainThread]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self showNaviString:string];
        });
        return;
    }
    self.toastView = [ToastView sharedToastView];
    [[UIApplication sharedApplication].keyWindow addSubview:self.toastView];
    if (self.toastView.superview != [UIApplication sharedApplication].keyWindow) {
        [self.toastView removeFromSuperview];
        [[UIApplication sharedApplication].keyWindow addSubview:self.toastView];
    }
    self.toastView.text = string;
    UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickToastView)];
    [self.self.toastView addGestureRecognizer:tap];

    if (!self.toastView.alpha)
    {
        self.toastView.alpha = 1.f;
        CGRect rect = self.toastView.frame;
        rect.origin.y = 0;
        [UIView animateWithDuration:0.5 animations:^{
            self.toastView.frame = rect;
        } completion:^(BOOL finished) {
            [self performSelector:@selector(hiddenView) withObject:self.toastView afterDelay:2];
            
        }];
    }
    
}

-(void)hiddenView{
    CGRect rect = self.toastView.frame;
    rect.origin.y = -64;
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        self.toastView.frame = rect;
    } completion:^(BOOL finished) {
        self.toastView.alpha = 0.f;
    }];

}

/*** 导航点击事件 ***/
-(void)addTarget:(id)target action:(SEL)action{
    _target = target;
    _action = action;
}


-(void)clickToastView{
    [_target performSelector:_action withObject:self];

}
/*** 底部toast 默认时间显示为3s ***/
+(void)showToastString:(NSString *)string{
    [self showToastString:string showTime:3.0f];
}
/*** 底部toast  自定义显示时间***/
+ (void)showToastString:(NSString *)string showTime:(float)showTime
{
    if (![[NSThread currentThread] isMainThread]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self showToastString:string showTime:showTime];
        });
        return;
    }
    UILabel *toastView = [CSYToastLabel sharedCSYToastLabel];
    [[UIApplication sharedApplication].keyWindow addSubview:toastView];
    if (toastView.superview != [UIApplication sharedApplication].keyWindow) {
        [toastView removeFromSuperview];
        [[UIApplication sharedApplication].keyWindow addSubview:toastView];
    }
    
    CGFloat width = [self stringText:string font:17 isHeightFixed:YES fixedValue:30];
    CGFloat height = 30;
    if (width > SCREEN_WIDTH - 30) {
        width = SCREEN_WIDTH - 30;
        height = [self stringText:string font:17 isHeightFixed:NO fixedValue:width];
    }
    
    CGRect frame = CGRectMake(([UIScreen mainScreen].bounds.size.width-width-10)/2,SCREEN_HEIGHT, width+10, height);
   
    toastView.text = string;
    toastView.font = [UIFont systemFontOfSize:17];
    toastView.layer.cornerRadius = height/2;
    toastView.layer.masksToBounds = YES;
    toastView.layer.borderWidth = 1.0f;
    toastView.layer.borderColor = [UIColor redColor].CGColor;
    toastView.frame = frame;
    [UIView animateWithDuration:0.3 animations:^{
        CGRect rect = toastView.frame;
        rect.origin.y = SCREEN_HEIGHT-40-rect.size.height;
        toastView.frame = rect;
        toastView.alpha = 1.0;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:showTime animations:^{
            toastView.alpha = 0;
        }];
    }];
    
}


//根据字符串长度获取对应的宽度或者高度
+ (CGFloat)stringText:(NSString *)text font:(CGFloat)font isHeightFixed:(BOOL)isHeightFixed fixedValue:(CGFloat)fixedValue
{
    CGSize size;
    if (isHeightFixed) {
        size = CGSizeMake(MAXFLOAT, fixedValue);
    } else {
        size = CGSizeMake(fixedValue, MAXFLOAT);
    }
    
    CGSize resultSize;
    //返回计算出的size
    resultSize = [text boundingRectWithSize:size options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:font]} context:nil].size;
    
    if (isHeightFixed) {
        return resultSize.width;
    } else {
        return resultSize.height;
    }
}
@end




static ToastView *toastView = nil;
@implementation ToastView
+(ToastView*) sharedToastView{
    static dispatch_once_t token;
    dispatch_once(&token, ^{
        if(toastView == nil)
        {
            toastView = [[self alloc] initWithFrame:CGRectMake(0, -64, SCREEN_WIDTH, 64)];
            toastView.alpha = 0;
            toastView.userInteractionEnabled = YES;
            toastView.backgroundColor = [UIColor blueColor];
            toastView.textColor = [UIColor whiteColor];
            toastView.font = [UIFont systemFontOfSize:14];
            toastView.textAlignment = NSTextAlignmentCenter;
            toastView.numberOfLines = 0;
        }
        
    });
    return toastView;
}

@end




static CSYToastLabel *toastLabel = nil;
@implementation CSYToastLabel
+(CSYToastLabel*) sharedCSYToastLabel{
    static dispatch_once_t token;
    dispatch_once(&token, ^{
        if(toastLabel == nil)
        {
            toastLabel = [[self alloc] init];
            toastLabel.textColor = [UIColor redColor];
            toastLabel.textAlignment = NSTextAlignmentCenter;
            toastLabel.alpha = 0;
            toastLabel.numberOfLines = 0;
            toastLabel.lineBreakMode = NSLineBreakByCharWrapping;
        }
    });
    return toastLabel;
}

@end

引用相当简单,仅需一行代码:

   // 导航提示效果
    SYToastView * tostV = [[SYToastView alloc]init];
    [tostV showNaviString:@"这是导航提示效果"];
    
    // 添加导航效果点击事件
    [tostV addTarget:self action:@selector(click)];
    
    // 底部仿安卓toast效果
    [SYToastView showToastString:@"默认显示3秒的toast"];
    
    [SYToastView showToastString:@"自定义显示时间的toast" showTime:5.0f];

导航栏提示效果
仿安卓Toast效果

代码示例:
https://github.com/csy0202/SYToastViewDemo/tree/master/SYToastViewDemo

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

推荐阅读更多精彩内容