8.超级彩图(storyboard和代码组合搭建界面)

实现目的:搭建一个小游戏界面,点击大图和图片实现图片的方法,点击提示清空当前所填的内容并提示第一个字,并扣除相应的分数。当打错的时候文字显示为红色,答对了显示为绿色并进入下一题,到达最后一题的时候下一题按钮不可选。

分析:首先搭建界面,在上半部分是固定的,直接通过storyboard实现,下半部分答案区和备选区按钮数量会跟着题目的变化为变化,用代码实现。图片放大以后新建一个蒙版同时用 bringSubviewToFront 方法将图像移动至顶层。缩放图片后将蒙版的hidden属性设置为YES。接下来是下半部分的内容,首先将字典转换成模型,并将其懒加载。

点击下一题的时候,题目索引的递增,取出相应的模型并设置题目的基本信息,并修改备选区的按钮上的字。当点击备选区按钮的时候,该按钮的hidden属性设置为YES,并且在答案区第一个部位空得位置上显示备选区传过来的文字。当答案区不为空的时候与标准答案做对比,如果一致,则为正确。当点击提示的时候,将答题区的按钮全部清空在备选区查找第一个按钮,并模拟点击。最后使答案区的文字设置成乱序。

效果演示:



主要实现代码:

// 图片方法

<span style="font-family: 'Heiti SC Light';">- (IBAction)bigImage</span>
{
    // 通过蒙板的alpha来判断按钮是否已经被放大
    if (self.cover.alpha == 0.0) { // 放大
        // bringSubviewToFront将子视图前置
        [self.view bringSubviewToFront:self.iconButton];
        
        // 3. 动画放大图像按钮
        CGFloat w = self.view.bounds.size.width;
        CGFloat h = w;
        CGFloat y = (self.view.bounds.size.height - h) * 0.5;
        
        [UIView animateWithDuration:0.6 animations:^{
            self.iconButton.frame = CGRectMake(0, y, w, h);
            self.cover.alpha = 1.0;
        }];
    } else { // 缩小
        [UIView animateWithDuration:0.6 animations:^{
            // 将图像恢复初始位置
            self.iconButton.frame = CGRectMake(80 , 110, 160, 160);
            self.cover.alpha = 0.0;
        }];
    }
}

// 下一题
- (IBAction)nextQuestion
{
    // 1.设置当前索引 ++
    self.index++;
    
    // 2.从数组中按照索引取出题目模型数据
    Question *question = self.questions[self.index];
    
    // 3.设置基本信息
    self.noLabel.text = [NSString stringWithFormat:@"%d/%lu",self.index + 1 ,(unsigned long)self.questions.count];
    self.titleLabel.text = question.title;
    self.iconButton.imageView.image = [UIImage imageNamed:question.icon];
  
    // 如果到达最后一题 禁用下一题按钮
      self.nextQuestionButton.enabled = (self.index < self.questions.count - 1);
    
    // 4.答题区按钮
    //计算位置
    CGFloat answerViewW = self.answerView.bounds.size.width;
    CGFloat answerH = self.answerView.bounds.size.height;
    CGFloat answerW= answerH;
    
    // 首先清除掉答题区内的所有按钮
    for (UIView *btn in self.answerView.subviews) {
        [btn removeFromSuperview];
    }
    NSUInteger length = question.answer.length;
    CGFloat answerX = (answerViewW - answerH * length - (length - 1) * kButtonMargin) * 0.5;
    
    //5. 创建所有答案按钮
    for (int i = 0; i < length; i++) {
        CGFloat x = answerX + i * (kButtonMargin + answerW);
        
        UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(x, 0, answerH, answerW)];
        [btn setBackgroundImage:[UIImage imageNamed:@"btn_answer"] forState:UIControlStateNormal];
        [btn setBackgroundImage:[UIImage imageNamed:@"btn_answei_highlighted"] forState:UIControlStateHighlighted];
        
        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        
        [self.answerView addSubview:btn];
        
        // 添加答案区监听方法
        [btn addTarget:self action:@selector(answerClick:) forControlEvents:UIControlEventTouchUpInside];
    }
    
    // 创建所有答案的按钮
    NSUInteger optionLength = question.options.count;
    
    CGFloat optionViewW = self.optionView.bounds.size.width;
    CGFloat optionH = answerH;
    CGFloat optionW = optionH;
    CGFloat optionX = (optionViewW - optionH * kTotolCol - (kTotolCol - 1) * kButtonMargin) * 0.5;
    
    // 首先清除掉答题区内的所有按钮
    for (UIView *btn in self.optionView.subviews) {
        [btn removeFromSuperview];
    }
    
    
    for (int i = 0; i < optionLength; i++){
        
        int row = i / kTotolCol;
        int col = i % kTotolCol;
        
        CGFloat x = optionX +col * (optionW + kButtonMargin);
        CGFloat y = row * (optionH + kButtonMargin);
        
        UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(x, y, optionH, optionW)];
        [btn setBackgroundImage:[UIImage imageNamed:@"btn_option"] forState:UIControlStateNormal];
        [btn setBackgroundImage:[UIImage imageNamed:@"btn_option_highlighted"] forState:UIControlStateHighlighted];
        [self.optionView addSubview:btn];
        
        // 设置备选按钮
        [btn setTitle:question.options[i] forState:UIControlStateNormal];
        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal ];
        
        [self.optionView addSubview:btn];
        
        // 添加监听方法
        [btn addTarget:self action:@selector(optionClick:) forControlEvents:UIControlEventTouchUpInside];
    }

}

#pragma mark - 提示功能
- (IBAction)tipClick
{
    // 1.将答案区所有的字清空
    for (UIButton *btn in self.answerView.subviews){
        // 用代码执行点击答案按钮操作
        [self answerClick:btn];
    }
    // 2.将答案第一字显示在答案区第一个位置
    Question *qusetion = self.questions[self.index];
    NSString *firstAnswer = [qusetion.answer substringToIndex:1];
    for (UIButton *btn in self.optionView.subviews) {
        if ([btn.currentTitle isEqualToString:firstAnswer] ) {
            [self optionClick:btn];
            // 3.扣分
            [self setScore:-100];

        }
    }
    //
}
#pragma mark - 分数操作
- (void)setScore:(int)score
{
    int currectScore = self.scoreButton.currentTitle.intValue;
    currectScore += score;
    [self.scoreButton setTitle:[NSString stringWithFormat:@"%d",currectScore] forState:UIControlStateNormal];
}
 // 答案区监听方法
- (void)answerClick:(UIButton *)button
{
    if (button.currentTitle.length == 0) return;
    for (UIButton *btn in self.optionView.subviews) {
        if ([btn.currentTitle isEqualToString:button.currentTitle] && btn.hidden == YES) {
            btn.hidden = NO;
            [button setTitle:@"" forState:UIControlStateNormal];
            [self setColor:[UIColor blackColor]];
        }
    }
}


- (void)optionClick:(UIButton *)button
{
    // 1.在答案区找到第一个文字为空的按钮
    UIButton *btn = [self firstAnswerButton];
    if (btn == nil) {
        return;
    }
    // 2.将button的标题设置给答案区按钮
    [btn setTitle:button.currentTitle forState:UIControlStateNormal];
    // 3.隐藏button
    button.hidden = YES;
    // 4.判断结果
    [self judag];
}

- (void)judag
{
    NSMutableString *strM = [NSMutableString string];
    // 如果所有的按钮都有字才需要判断 遍历所有答题区按钮
    for (UIButton *btn in self.answerView.subviews) {
        if (btn.currentTitle.length == 0) {
            [self setColor:[UIColor blackColor]];
            // 只要有一个按钮没有字就不执行
            return;
        }else{
            [strM appendString:btn.currentTitle];// 拼接临时字符串
    }
    
    // 根据self.index获得当前question
    Question *question = self.questions[self.index];
    
    // 如果一致就更改字体颜色进入下一题
     if ([strM isEqualToString:question.answer]) {
        [self setColor:[UIColor blueColor]];
         [self setScore:1000];
         
         
        // 判断如果不是最后一题
         if (self.index != 9 )
        [self performSelector:@selector(nextQuestion) withObject:nil afterDelay:0.5];
    }else
    {
        [self setColor:[UIColor redColor]];
    }
    }
}

- (void)setColor:(UIColor *)color
{
    for (UIButton *btn in self.answerView.subviews) {
        [btn setTitleColor:color forState:UIControlStateNormal];
    }
}

- (UIButton *)firstAnswerButton
{
    // 取按钮的标题 遍历答题区所有按钮
    for (UIButton *btn in self.answerView.subviews){
        if (btn.currentTitle.length == 0) {
            return btn;
        }
    }
    return nil;
}



 产生乱码:

- (void)randamOptions
{
    self.options = [self.options sortedArrayUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) {
        int seed = arc4random_uniform(2);
        
        if (seed) {
            return [str1 compare:str2];
        }else{
            return [str2 compare:str1];
        }
    }];
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值