ios学习之个人笔记(超级猜图)

最终效果:
这里写图片描述
步骤:
拖拽上半部控件
大小图切换
点击“图片”或“大图”放大图片并生成遮罩,图片置于最上层,点击遮罩阴影消失图片缩小
2)下一题
判断是否是最后一题,如果是则禁用“下一题”按钮
3)提示
点击“提示”按钮,积分-1000,清空答案按钮文字,并把本题答案的第一个字显示到第一个答案按钮上

生成答案按钮和待选按钮
拖两个view分别放置答案按钮和待选按钮
答案按钮生成
根据题目的正确答案个数动态生成答案按钮
答案按钮的点击事件,被点击的答案按钮文字清空,并把对应的待选按钮显示
待选按钮生成
根据题目的待选按钮个数动态生成
待选按钮点击事件,首先判断答案按钮是否已满,不满则被点击按钮隐藏并把文字显示到第一个为空的答案按钮上,如果已满则禁止待选按钮与用户交互。
判断答案是否正确,首先判断答案按钮是否已满,已满则取出答案按钮的文字与当前题目的答案作对比。如果答案正确,则设置答案按钮文字为蓝色,延迟5秒跳转到下一题,积分+100,否则答案按钮文字变红。

//这是model类
#import "YZQuestions.h"

@implementation YZQuestions


-(instancetype) initWithDict:(NSDictionary *)dict{
    if (self == [super init]) {
        self.answer = dict[@"answer"];
        self.icon = dict[@"icon"];
        self.title = dict[@"title"];
        self.options = dict[@"options"];
    }
    return self;
}
+(instancetype) questionWithDict:(NSDictionary *)dict{
    return [[self alloc] initWithDict:dict];
}

+(NSArray *)questions{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"questions.plist" ofType:nil];
    NSArray *arrDict = [NSArray arrayWithContentsOfFile:path];

    NSMutableArray *arr = [NSMutableArray array];
    for (NSDictionary *dict in arrDict) {
        [arr addObject:[self questionWithDict:dict]];
    }
    return arr;
}
@end

viewController类

#import "ViewController.h"
#import "YZQuestions.h"
@interface ViewController () <UIAlertViewDelegate>
@property (nonatomic,copy) NSArray *questions;
@property (weak, nonatomic) IBOutlet UILabel *lblIndex;
@property (weak, nonatomic) IBOutlet UIButton *btnScore;
@property (weak, nonatomic) IBOutlet UILabel *lblTitle;
@property (weak, nonatomic) IBOutlet UIButton *btnIcon;
@property (weak, nonatomic) IBOutlet UIButton *btnNext;

//记录图片原始大小
@property (nonatomic,assign) CGRect iconFrame;
//引用遮罩
@property(weak,nonatomic)UIButton *cover;
//图片索引
@property (nonatomic,assign) int index;
@property (weak, nonatomic) IBOutlet UIView *btnAnswers;
@property (weak, nonatomic) IBOutlet UIView *btnOptions;

- (IBAction)btnTipClick;
- (IBAction)btnIconClick:(id)sender;
- (IBAction)btnBigImgClick:(id)sender;

- (IBAction)btnNextClick;

@end

@implementation ViewController

//懒加载数据
-(NSArray *)questions{
    if (_questions == nil) {
        _questions = [YZQuestions questions];
    }
    return _questions;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.index = -1;
    [self btnNextClick];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
#pragma mark 提示按钮事件
- (IBAction)btnTipClick {
    //积分-1000
    [self settingScore:-1000];
    //清空答案按钮文字
    for (UIButton *btn in self.btnAnswers.subviews) {
        [self btnAnsClick:btn];
    }
    YZQuestions *question = self.questions[self.index];
    for (UIButton *btn in self.btnAnswers.subviews) {
        //把正确答案的第一个字显示到第一个答案按钮上
        NSString *firstStr = [question.answer substringToIndex:1];
        [btn setTitle:firstStr forState:UIControlStateNormal];
        break;
    }

}
#pragma mark 图片点击事件
- (IBAction)btnIconClick:(id)sender {
    if (self.cover == nil) {
        [self btnBigImgClick:nil];
    }

}
#pragma mark 大图按钮事件
- (IBAction)btnBigImgClick:(id)sender {
    self.iconFrame = self.btnIcon.frame;
    //生成遮罩
    UIButton *btnCover = [[UIButton alloc] init];
    self.cover = btnCover;
    btnCover.frame = self.view.bounds;
    btnCover.backgroundColor = [UIColor blackColor];
    btnCover.alpha = 0;
    [self.view addSubview:btnCover];
    //设置图片属性
    CGFloat iconW = self.view.frame.size.width;
    CGFloat iconH = iconW;
    CGFloat iconX = 0;
    CGFloat iconY = (self.view.frame.size.height - iconW)/2;
    [UIView animateWithDuration:0.7 animations:^{
        self.btnIcon.frame = CGRectMake(iconX, iconY, iconW, iconH);
        //阴影在动画中透明度变大
        btnCover.alpha = 0.7;
    }];
    [self.view bringSubviewToFront:self.btnIcon];
    //为遮罩注册单机事件
    [btnCover addTarget:self action:@selector(smallImageClick) forControlEvents:UIControlEventTouchUpInside];
}

#pragma mark 图片还原事件
-(void)smallImageClick{
    [UIView animateWithDuration:0.7 animations:^{
        //图片还原
        self.btnIcon.frame = self.iconFrame;
        //遮罩透明度变为0
        self.cover.alpha = 0;
    } completion:^(BOOL finished) {
        //移除遮罩
        [self.cover removeFromSuperview];
    }];
}
#pragma mark 下一题单击事件
- (IBAction)btnNextClick {
    //开启待选按钮与用户交互
    self.btnOptions.userInteractionEnabled = YES;
    //索引++
    self.index++;
    //判断是否是最后一题
    if (self.index == self.questions.count) {
        //弹出对话框
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"恭喜通关!" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        [alertView show];
        return;
    }

    YZQuestions *model = self.questions[self.index];
    //设置空间属性
    [self settingData:model];
    //设置答案按钮
    [self settingBtnAnswers:model];
    //设置待选按钮
    [self settingBtnOptions:model];

}
#pragma mark 设置控件属性
-(void)settingData:(YZQuestions *)model{
    self.lblIndex.text = [NSString stringWithFormat:@"%d/%ld",self.index+1,self.questions.count];
    self.lblTitle.text = [NSString stringWithFormat:@"%@",model.title];
    [self.btnIcon setImage:[UIImage imageNamed:model.icon] forState:UIControlStateNormal];
    //判断是否是最后一题,然后是否禁用
    self.btnNext.enabled = (self.index != (self.questions.count-1));
}
#pragma mark 设置答案按钮
-(void)settingBtnAnswers:(YZQuestions *)model{
    //清除之前答案按钮
    [self.btnAnswers.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    //获取本题答案按钮个数
    NSInteger num = model.answer.length;
    //设置按钮属性
    CGFloat btnW = 35;
    CGFloat btnH =btnW;
    CGFloat margin =10;
    CGFloat marginLeft = (self.btnAnswers.frame.size.width - num * btnW - (num-1)*margin)/2;
    CGFloat btnY = 0;
    //创建答案按钮
    for (int i=0; i<num; i++) {
        UIButton *btnAnswer = [[UIButton alloc] init];
        //设置按钮背景图
        [btnAnswer setBackgroundImage:[UIImage imageNamed:@"btn_answer" ]forState:UIControlStateNormal];
        [btnAnswer setBackgroundImage:[UIImage imageNamed:@"btn_answer_highlighted" ] forState:UIControlStateHighlighted];
        //设置答案按钮文字
        [btnAnswer setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        CGFloat btnX = marginLeft + i * (btnW + margin);
        btnAnswer.frame = CGRectMake(btnX, btnY, btnW, btnH);
        [self.btnAnswers addSubview:btnAnswer];
        //设置答案按钮单击事件
        [btnAnswer addTarget:self action:@selector(btnAnsClick:) forControlEvents:UIControlEventTouchUpInside];
    }
}
#pragma mark 答案按钮单击事件
-(void)btnAnsClick:(UIButton *)sender{
    [self setAnswersColor:[UIColor blackColor]];
    //开启待选按钮与用户交互
    self.btnOptions.userInteractionEnabled = YES;
    //被点击按钮文字消失
    [sender setTitle:nil forState:UIControlStateNormal];
    //让对应的待选按钮显示
    for (UIButton *btn in self.btnOptions.subviews) {
        if (btn.tag == sender.tag) {
            btn.hidden = NO;
            break;
        }
    }
}
#pragma mark 设置待选按钮
-(void)settingBtnOptions:(YZQuestions *)model{
    //清除之前待选按钮
    [self.btnOptions.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    //获取待选按钮个数
    NSArray *opts = model.options;
    //设置待选按钮属性
    int colums = 7;
    CGFloat btnW = 35;
    CGFloat btnH =btnW;
    CGFloat margin =10;
    CGFloat marginLeft = (self.btnOptions.frame.size.width - colums * btnW - (colums-1)*margin)/2;
     for (int i=0; i<opts.count; i++) {
        UIButton *btnOption = [[UIButton alloc] init];
         //设置按钮背景图
         [btnOption setBackgroundImage:[UIImage imageNamed:@"btn_option" ]forState:UIControlStateNormal];
         [btnOption setBackgroundImage:[UIImage imageNamed:@"btn_option_Highlighted" ] forState:UIControlStateHighlighted];
         //设置待选按钮文字
         [btnOption setTitle:opts[i] forState:UIControlStateNormal];
         [btnOption setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
         btnOption.tag = i;
        int colIdx = i%colums;
        int rowIdx = i/colums;
        CGFloat btnX = marginLeft + colIdx*(btnW+margin);
        CGFloat btnY = rowIdx*(btnH + margin);
        btnOption.frame = CGRectMake(btnX, btnY, btnW, btnH);
        [self.btnOptions addSubview:btnOption];
         //给待选按钮添加单击事件
         [btnOption addTarget:self action:@selector(btnOptClick:) forControlEvents:UIControlEventTouchUpInside];
    }
}
#pragma mark 待选按钮单机事件
-(void)btnOptClick:(UIButton *)sender{
    //被点击按钮隐藏
    sender.hidden = YES;
    NSString *text = sender.currentTitle;
    //把字体显示到第一个为空得答案按钮上
    for (UIButton *btn in self.btnAnswers.subviews) {
        if (btn.currentTitle == nil) {
            [btn setTitle:text forState:UIControlStateNormal];
            btn.tag = sender.tag;
            break;
        }
    }
    //判断答案按钮是否已满
    [self judge];
}
#pragma mark 判断答案事件
-(void)judge{
    BOOL isFull = YES;
    //用来存储用户点击的答案
    NSMutableString *userAnswers = [NSMutableString string];
    for (UIButton *btn in self.btnAnswers.subviews) {
        if (btn.currentTitle == nil) {
            isFull = NO;
            break;
        }else{
            [userAnswers appendString:btn.currentTitle];
        }
    }
    if (isFull) {
        //禁止待选按钮与用户交互
        self.btnOptions.userInteractionEnabled = NO;
        //判断答案是否正确
        YZQuestions *question = self.questions[self.index];
        if ([question.answer isEqualToString:userAnswers]) {
            //积分100
            [self settingScore:100];
            //答案字体变蓝
            [self setAnswersColor:[UIColor blueColor]];
            //如果答案正确延迟5秒跳转到下一题
            [self performSelector:@selector(btnNextClick) withObject:nil afterDelay:0.5];
        }else{
            [self setAnswersColor:[UIColor redColor]];
        }
    }
}
#pragma mark 设置答案按钮字体颜色
-(void)setAnswersColor:(UIColor *) color{
    for (UIButton *btnAns in self.btnAnswers.subviews) {
        [btnAns setTitleColor: color forState:UIControlStateNormal];
    }
}
#pragma mark 计算积分
-(void)settingScore:(int)score{
    int currentScore = self.btnScore.currentTitle.intValue + score;

    [self.btnScore setTitle:[NSString stringWithFormat:@"%d",currentScore] forState:UIControlStateNormal];
}
#pragma mark 代理方法
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    //如果通关后点击确定跳转到第一题
    if (buttonIndex == 1) {
        self.index = -1;
        [self btnNextClick];
    }
}
@end

超级猜图素材

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值