iOS程序第一次启动的时候设置引导语

当我们第一次使用一个APP的时候或者APP增加了新功能的时候,我们有时候会设置一些引导语,来告诉用户某个按钮或者某个模块是干什么用的,有什么功能,有什么特色。今天自己写了个demo,记录一下,以后如果项目中用到了,就只能copy了。好了,废话不多说了,先上图看看效果。


gif.gif

先贴上部分代码,说说思路吧。

先定义一个继承UIView的DCPopView,.h

#import <UIKit/UIKit.h>

typedef void(^onDismiss)(void);

typedef enum : NSUInteger {
    TOP,
    BOTTOM,
} DIRECTION;
@interface DCPopView : UIView

@property (nonatomic,copy) onDismiss block;
@property(nonatomic, assign) DIRECTION direction;
- (instancetype)initWithAlertContentString:(NSString *)contentStr withImage:(NSString *)image withSpecificUI:(UIView *)view;
@end

.m

@interface DCPopView ()

@property(nonatomic,strong)UIView *view;
@property(nonatomic,strong)UILabel *contentLab;
@property(nonatomic,copy)NSString *contentStr;
@property(nonatomic,copy)NSString *image;
@property(nonatomic,strong)UIImageView *arrowImgV;
@property (nonatomic,strong) UIView *backgroundView;
@end
-(instancetype)initWithAlertContentString:(NSString *)contentStr withImage:(NSString *)image withSpecificUI:(UIView *)view
{
    if (self = [super init]) {
        self.view = view;
        self.contentStr = contentStr;
        self.image = image;
        
        [self setUpMainView];
    }
    return self;
}

设置UI布局

  -(void)setUpMainView
{
    self.backgroundView = [[UIView alloc]init];
    self.backgroundView.backgroundColor = [UIColor lightGrayColor];
    self.backgroundView.alpha = 0.3;
    UITapGestureRecognizer *tapBackgroundView = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapBackgroundView)];
    [self.backgroundView addGestureRecognizer:tapBackgroundView];
    self.backgroundView.userInteractionEnabled = YES;
    [[UIApplication sharedApplication].keyWindow addSubview:self.backgroundView];
    
    self.arrowImgV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.image]];
    [[UIApplication sharedApplication].keyWindow addSubview:self.arrowImgV];
    
    self.contentLab = [[UILabel alloc]init];
    self.contentLab.text = self.contentStr;
    self.contentLab.numberOfLines = 0;
    self.contentLab.textAlignment = NSTextAlignmentCenter;
    self.contentLab.font = [UIFont systemFontOfSize:14];
    self.contentLab.textColor = [UIColor whiteColor];
    [self.arrowImgV addSubview:self.contentLab];
}

设置frame

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundView.frame = [UIScreen mainScreen].bounds;
    
    CGSize contentMaxSize = CGSizeMake(100, CGFLOAT_MAX);
    NSDictionary *contentDic = @{NSFontAttributeName:[UIFont systemFontOfSize:16]};
    CGSize contentSize = [self.contentStr boundingRectWithSize:contentMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:contentDic context:nil].size;
    self.arrowImgV.size = CGSizeMake(contentSize.width + 30, contentSize.height + 30);
    
    if (self.view.frame.origin.x < [UIScreen mainScreen].bounds.size.width * 0.5) {
        if (self.direction == BOTTOM) {
            _arrowImgV.x = self.view.centerX + self.view.width/2 - self.arrowImgV.width;
        }else if (self.direction == TOP){
            _arrowImgV.x = self.view.x + self.view.width/4;
        }
    } else {
        _arrowImgV.x = self.view.centerX + self.view.width/3 - self.arrowImgV.width;
    }
    if (self.direction == BOTTOM) {
        self.arrowImgV.y = CGRectGetMaxY(self.view.frame)+5;
    }else if (self.direction == TOP){
        self.arrowImgV.y = CGRectGetMaxY(self.view.frame)- self.view.height - self.arrowImgV.height - 5;
    }
    
    self.contentLab.frame = CGRectMake(5, 10, self.arrowImgV.width - 10, self.arrowImgV.height - 20);
}

点击背景view

-(void)tapBackgroundView
{
    __weak typeof(self) weakself = self;
    [UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:1 initialSpringVelocity:1 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
        weakself.arrowImgV.transform = CGAffineTransformMakeScale(0.01, 0.01);
    } completion:^(BOOL finished) {
        [weakself.contentLab removeFromSuperview];
        [weakself.arrowImgV removeFromSuperview];
        [weakself.backgroundView removeFromSuperview];
        if (weakself.block) {
            weakself.block();
        }
    }];
}

接下来就是引用

判断是否是第一次进入程序

-(void)judgeIfIsFirstLogin
{
    if(!self.firstIn) {
        self.firstIn = YES;

        NSNumber* version = UserDefault(nil, @"HomeViewController_guide_setup1");
        int currentVersion = 1;
        if (version == nil || version.intValue < currentVersion) {
            UserDefault([NSNumber numberWithInt:currentVersion], @"HomeViewController_guide_setup1");
            [self showRemind:1];
        }
    }
}

如果是第一次进来,就调用引导语

-(void) showRemind:(int)setup
{
    UIView* view;
    
    if (setup == 1) {
        view = self.firstView;
    }else if(setup == 2) {
        view = self.secondView;
    }else if(setup ==3) {
        view = self.thirdView;
    }else if (setup == 4){
        view = self.forthView;
    }else if (setup == 5){
        view = self.fiveView;
    }else{
        return;
    }
    NSString* content;
    NSString* imageStr;
    switch (setup) {
        case 1:
            content = @"1、点击这里加班你想干嘛😀";
            imageStr = @"rem_01";
            break;
            
        case 2:
            content = @"2、点击这里加班你想干嘛😂";
            imageStr = @"rem_01";
            break;
            
        case 3:
            content = @"3、点击这里加班你想干嘛😋";
            imageStr = @"rem_05";
            break;
        case 4:
            content = @"4、点击这里加班你想干嘛🙄";
            imageStr = @"rem_03";
            break;
        case 5:
            content = @"5、点击这里加班你想干嘛😊";
            imageStr = @"rem_01";
            break;
        default:
            break;
    }
    
    DCPopView *popView = [[DCPopView alloc] initWithAlertContentString:content withImage:imageStr withSpecificUI:view];
    
    if (setup == 1 || setup == 2 || setup == 5) {
        popView.direction = BOTTOM;
    }else{
        popView.direction = TOP;
    }
    setup = setup + 1;
    __weak typeof(self) weakself = self;
    popView.block = ^{
        [weakself showRemind:setup];
    };
    [self.view addSubview:popView];
}

思路很简单,代码也很简单,属于一看就会的那种,实现的方法肯定不止一种,后期如果看到更简单的,会陆续更新上,如果有什么好的建议,欢迎在下面留言指正哦。GitHub地址

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,964评论 3 119
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,225评论 25 707
  • “去看了文艺汇演,喜欢上一个人,远远的看不清是男孩还是女孩,立挺的,倔强的头发,声音响起来的时候好象是女生,如果她...
    深蓝L阅读 300评论 0 0