zoukankan      html  css  js  c++  java
  • [iOS基础控件

    A.需要掌握的
    1.添加图片资源(暂时认为@2x跟非@2x代表同一张图片)

    2.搭建UI界面
    * 文本标签
    * 4个按钮
    * 中间的图片

    3.设置状态栏样式

    4.监听下一题按钮的点击

    5.延迟加载数据
    * 加载plist
    * 字典转模型
    * KVC的引入

    6.切换下一题的序号、图片、标题,下一题按钮的可用性

    7.默认显示第1条题目

    8.显示大图
    * 监听中间图片点击
    * 添加遮盖
    * 移动图片(注意头像图片的层级顺序)
    * 监听“大图按钮”

    9.展示答案的个数

    10.展示待选答案

    11.答案处理

    12.提示功能

    13.Icon和Launch、@2x
     
    B.实现思路
    1.构建基本UI:
    (1)背景
    (2)按钮
    (3)图片
    (4)选项
     
    2.数据存储与加载
    (1)标题数据
    (2)图片数据
    (3)可选项数据
    (4)答案数据
    (5)得分数据
     
    3.大图功能 (点击图片或者按钮)
    (1)放大并调整图片位置
    (2)虚化背景,使用半透明全覆盖的button
    (3)点击背景或者图片,删除半透明背景、恢复图片
         a.动画效果, 使用带block参数方法
         b.播放完动画再移除阴影元素
     
    4.下一题功能
    其调用的功能是整个APP的核心,包含了初始化控件、加载文件数据、删除旧控件、加入新控件、刷新界面
     
    5.提示功能
    给出一定的答案
     
    6.帮助功能
    (在线分享功能,没有实现)
     
    C.知识点
    1.设置状态栏 (iOS7开始)
    (1)设置样式
    在Controller中重写preferredStateBarStyle方法,返回要设置的值
     1 // 设置状态栏是否隐藏
     2 - (BOOL)prefersStatusBarHidden {
     3     return NO;
     4 }
     5  
     6 // 设置状态栏
     7 - (UIStatusBarStyle)preferredStatusBarStyle {
     8     // 设置状态栏字体为白色
     9     return UIStatusBarStyleLightContent;
    10 }
     
    状态栏是显示黑色字体:
    Image(21)
     
    修改之后:
    Image(22)
     
    2.APP图标
    只要文件名为 “Icon.png”,就会被设置为APP图标
     
    3.启动画面
                   一个app在启动过程中会全屏显示叫做Default.png的图片
                   不用规格Default的使用场合
    1.      Default.png:非retina-iPhone屏幕,320x480
    2.          Default@2x.png:retina-iPhone屏幕,640x960
    3.          Default-568h@2x.png:4inch的retina-iPhone屏幕,640x1136
    4.          Default-Portrait~ipad.png:非retain-iPad竖屏屏幕,768x1024
    5.          Default-Portrait~ipad@2x.png:retain-iPad竖屏屏幕,1536x2048
    6.          Default-Landscape~ipad.png:非retain-iPad横屏屏幕,1024x768
    7.          Default-Landscape~ipad@2x.png:retain-iPad横屏屏幕,2048x1536
     
     
    4.背景图和前景元素之间的层次关系
    一般按照storyboard中的顺序排列
    使用代码把某个元素提到最前
        // 2.更换阴影和图片的位置
        [self.view bringSubviewToFront:self.icon];
     
     
    5.使用Button做出中间的图片
    为了做出有白边效果的图片,使用了白色图片作为背景,然后设置图片的边距Inset,露出白色背景图
    EA99AFD1-D3CC-4752-B1C2-C403A53469B2                   Image(23)
     
     
    6.延迟加载数据
    改写controller中的题目数组questions 的get方法,在调用get方法的时候检测questions是否已经存在,否则才开始加载
     
    7.“大图”功能
    虚化背景:使用一张半透明的图片遮挡
    图片放大:使用形变转换
    动画效果:使用带block参数的动画方法,设置动画事件、完成动画后消除遮盖回收内存
    Image(24)
     
    8.恢复图片
    点击遮盖 / 点击放大后的图片:消除遮盖,恢复图片
     
    9.消除button被点击的时候变灰
    取消勾选 “Highlighted Adjusts Image”
    310D161E-984E-467C-A35B-982ABEC2528B
     
    10.显示答案
    使用button, 动态生成相应数量的button
    使用UIView作为父控件包含多个答案button
    在storyboard中创建一个UIView,放到合适位置,调整尺寸
    Image(25)
     
    点击 "下一题” 按钮:
    删除旧答案,自己控制自己从父视图删除
    1     // 5.1 删除全部旧答案的button
    2     [self.answerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
     
    添加新答案
    Image(26)
     
     
    11.加入选项
    原理同答案模块,多了在行上面的位置计算
    Image(27)
     
    删除旧的所有选项,添加新的选项
    1     // 6.1 删除旧选项
    2     [self.optionsView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
     
    12.点击选项
    (1)被点击的选项按钮消失(hidden = YES)
    (2)将选中选项的文字放到答案区的按钮上
    (3)把文字放到第一个没有文字的答案按钮上
    (4)点击有文字的答案按钮,文字恢复到选项
    (5)答案填满后,阻止事件触发
    33FD92B2-FAD9-4C42-BB83-6C39A18794B9
     
    13.点击有文字的答案按钮
    (1)被点击的答案按钮文字消失
    (2)让答案文字对应的选项重新出现
    遍历所有选项,找到对应的选项进行设置
    BC7D8FF5-C521-4D10-878C-1AF6A21CD412
     
    14.判断答案正确
    (1)遍历答案区,判断每个答案按钮是否有文字,如果都有文字,证明已经完成,检查答案
    (2)答错答案文字变红,退选答案恢复文字颜色为黑色
    (3)答对了给出提示,延迟1秒后跳入下一题
    Image(28)
     
    17.分数计算
    答对加分
    FA22DACD-0B66-4600-872C-1D9C1C64CE60
     
    18.提示功能
    取消现有的所有答案,给出正确答案的第一个字,扣一定分数
    Image(29)
     
     
    19.更改图标
    图标有命名规范,最好使用 “icon.png"
    把所有图标文件拖放到 “Images.xcassets” 的”AppIcon” 里面
    70E67CAB-3903-4DCD-9FD8-056C59554929
     
    Image(30)
     
    20.修改启动画面
     
    注意:
    在现时最新版Xcode6.1中,默认使用 LaunchScreen.xib 作为启动画面
    现在有两种方式设置启动图片
    • 使用 xib (LaunchScreen)
    • 使用 LaunchImage
     
    启动页面配置:
    项目 ==> general ==> App Icons and Launch Images
    (1)使用 xib
    a.默认状态就是使用 xib
    Image(31)
     
    b.如果现状态是使用LaunchImage, 设置 “Launch Images Source” 为 “Don’t use asset catalogs”
    Image(32)
     
    c.设置 xib 的文件名
    Image(33)
     
    d.在 xib 中设计
    Image(34)
     
    e.效果
    Image(35)
     
     
    (2)使用 LaunchImage
    a.更改配置
    项目 ==> general ==> App Icons and Launch Images ==> Launch Images Source 中选择 images,再把Launch Screen File 选项设置为空
    922EB7CD-0780-4E6F-A2BD-7488C6B0CB0F
     
     
    b.会发现Images.xcassets 下自动生成了一个 LaunchImage 的Imageset
    Image(36)
     
    c.拖入画面
    Image(37)
     
    d.效果
    Image(38)
     
     
    主要代码:
    ViewController.m:
      1 //
      2 //  ViewController.m
      3 //  CrazyGuessGame
      4 //
      5 //  Created by hellovoidworld on 14/11/26.
      6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 #import "Question.h"
     11 
     12 @interface ViewController ()
     13 
     14 @property (weak, nonatomic) IBOutlet UILabel *noLabel; // 序号
     15 @property (weak, nonatomic) IBOutlet UILabel *titleLabel; // 标题
     16 @property (weak, nonatomic) IBOutlet UIButton *icon;
     17 @property (weak, nonatomic) IBOutlet UIButton *nextImageButton;
     18 @property (weak, nonatomic) IBOutlet UIView *answerView;
     19 @property (weak, nonatomic) IBOutlet UIView *optionsView;
     20 @property (weak, nonatomic) IBOutlet UIButton *scoreButton;
     21 
     22 - (IBAction)onTipsButtonClicked;
     23 - (IBAction)onHelpButtonClicked;
     24 - (IBAction)onEnlargeImgButtonClicked;
     25 - (IBAction)onNextImgButtonClicked;
     26 - (IBAction)onImageClicked;
     27 
     28 /** 所有题目 */
     29 @property(nonatomic, strong) NSArray *questions;
     30 
     31 /** 当前题目序号 */
     32 @property(nonatomic, assign) int index;
     33 
     34 /** 遮盖阴影 */
     35 @property(nonatomic, weak) UIButton *cover;
     36 
     37 /** 原始图片位置、尺寸 */
     38 @property(nonatomic, assign) CGRect imageOriginalFrame;
     39 
     40 /** 答案是否已经填满标识 */
     41 @property(nonatomic, assign) BOOL isAnswerCompleted;
     42 
     43 /** 得分 */
     44 @property(nonatomic, assign) int score;
     45 
     46 @end
     47 
     48 @implementation ViewController
     49 
     50 - (void)viewDidLoad {
     51     [super viewDidLoad];
     52     // Do any additional setup after loading the view, typically from a nib.
     53    
     54     //存储原始图片的位置、尺寸信息
     55     self.imageOriginalFrame = self.icon.frame;
     56    
     57     self.index = -1;
     58     [self onNextImgButtonClicked]; // 初次加载,index是0
     59 }
     60 
     61 - (void)didReceiveMemoryWarning {
     62     [super didReceiveMemoryWarning];
     63     // Dispose of any resources that can be recreated.
     64 }
     65 
     66 // 改写getter, 延迟加载,此处不要使用self.questions来取得questions,否则陷入死循环
     67 - (NSArray *)questions {
     68     if (nil == _questions) {
     69         // 1.加载plist数据
     70         NSArray *questionDictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"questions" ofType:@"plist"]];
     71        
     72         NSMutableArray *questionsArray = [NSMutableArray array];
     73         for (NSDictionary *questionDict in questionDictArray) {
     74             // 2.将数据封装到Model "Question"
     75             Question *question = [Question initWithDictionary:questionDict];
     76             [questionsArray addObject:question];
     77         }
     78 
     79         // 3.赋值
     80         _questions = questionsArray;
     81     }
     82    
     83     return _questions;
     84 }
     85 
     86 // 设置状态栏是否隐藏
     87 - (BOOL)prefersStatusBarHidden {
     88     return NO;
     89 }
     90 
     91 
     92 // 设置状态栏
     93 - (UIStatusBarStyle)preferredStatusBarStyle {
     94     // 设置状态栏字体为白色
     95     return UIStatusBarStyleLightContent;
     96 }
     97 
     98 
     99 // 点击“提示”按钮
    100 - (IBAction)onTipsButtonClicked {
    101     // 1.清除现有的答案
    102     for (UIButton *currentAnswerButton in self.answerView.subviews) {
    103         [self onAnswerClicked:currentAnswerButton];
    104     }
    105    
    106     // 2.取出正确答案片段
    107     Question *question = self.questions[self.index];
    108     NSString *partOfCorrectAnswer = [question.answer substringToIndex:1];
    109    
    110     // 3.填充到答案区
    111     for (UIButton *optionButton in self.optionsView.subviews) {
    112         if ([partOfCorrectAnswer isEqualToString:optionButton.currentTitle]) {
    113             [self onOptionClicked:optionButton];
    114         }
    115     }
    116    
    117     // 5.扣取相应分数
    118     [self calScore:-500];
    119 }
    120 
    121 // 点击“帮助”按钮
    122 - (IBAction)onHelpButtonClicked {
    123 }
    124 
    125 // 点击“大图”按钮
    126 - (IBAction)onEnlargeImgButtonClicked {
    127     // 1.1添加阴影
    128     UIButton *cover = [[UIButton alloc] init];
    129     cover.frame = self.view.bounds;
    130     cover.backgroundColor = [UIColor blackColor];
    131     cover.alpha = 0;
    132    
    133     // 1.2给阴影添加变回小图的触发事件
    134     [cover addTarget:self action:@selector(smallImg) forControlEvents:UIControlEventTouchUpInside];
    135    
    136     self.cover = cover;
    137     [self.view addSubview:cover];
    138    
    139     // 2.更换阴影和图片的位置
    140     [self.view bringSubviewToFront:self.icon];
    141    
    142     // 3.更改图像大小,显示阴影
    143     [UIView animateWithDuration:1 animations:^{
    144         cover.alpha = 0.7;
    145        
    146         CGFloat iconWidth = self.view.frame.size.width;
    147         CGFloat iconHeight = iconWidth;
    148         CGFloat iconX = 0;
    149         CGFloat iconY = (self.view.frame.size.height / 2) - (iconHeight / 2);
    150         self.icon.frame = CGRectMake(iconX, iconY, iconWidth, iconHeight);
    151     }];
    152 }
    153 
    154 /** 缩小图片 */
    155 - (void) smallImg {
    156     [UIView animateWithDuration:1 animations:^{
    157         // 1.删除阴影
    158         self.cover.alpha = 0;
    159        
    160         // 2.恢复图片
    161         self.icon.frame = self.imageOriginalFrame;
    162        
    163     } completion:^(BOOL finished) {
    164         // 动画执行完成后
    165        
    166         [self.cover removeFromSuperview];
    167         self.cover = nil;
    168     }];
    169    
    170 }
    171 
    172 // 点击“下一题”按钮
    173 - (IBAction)onNextImgButtonClicked {
    174     self.index++;
    175    
    176     // 1.取出相应地Model数据
    177     Question *question = self.questions[self.index];
    178 
    179     // 2.设置控件
    180     [self setControls:question];
    181    
    182     // 3.设置答案
    183     [self addAnswer:question];
    184    
    185     // 4.设置选项
    186     [self addOptions:question];
    187    
    188 
    189 }
    190 
    191 /** 设置控件 */
    192 - (void) setControls:(Question *) question {
    193     // 1.答案是否已经填满
    194     self.isAnswerCompleted = NO;
    195    
    196     // 2.得分
    197     [self.scoreButton setTitle:[NSString stringWithFormat:@"%d", self.score] forState:UIControlStateNormal];
    198    
    199     // 2.设置序号
    200     self.noLabel.text = [NSString stringWithFormat:@"%d/%d", self.index + 1, self.questions.count];
    201    
    202     // 3.设置标题
    203     self.titleLabel.text = question.title;
    204    
    205     // 4.设置图片
    206     [self.icon setImage:[UIImage imageNamed:question.icon] forState:UIControlStateNormal];
    207    
    208     // 5.设置“下一题”按钮
    209     self.nextImageButton.enabled = (self.index + 1) != self.questions.count;
    210 }
    211 
    212 /** 加入答案区 */
    213 - (void) addAnswer:(Question *) question {
    214     // 5.1 删除全部旧答案的button
    215     [self.answerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    216    
    217     // 5.1 加入新答案
    218     int answerCount = question.answer.length; // 答案字数
    219    
    220     // 初始化尺寸信息
    221     CGFloat answerWidth = 35;
    222     CGFloat answerHeight = self.answerView.frame.size.height;
    223     CGFloat answerMargin = 10;
    224     CGFloat answerMarginLeft = (self.answerView.frame.size.width - answerWidth * answerCount - answerMargin * (answerCount - 1) ) / 2;
    225    
    226     for (int i=0; i<question.answer.length; i++) {
    227         // 计算位置
    228         CGFloat answerX = answerMarginLeft + i * (answerWidth + answerMargin);
    229         CGFloat answerY = 0;
    230        
    231         UIButton *answerButton = [[UIButton alloc] initWithFrame:CGRectMake(answerX, answerY, answerWidth, answerHeight)];
    232        
    233         // 设置背景
    234         [answerButton setBackgroundImage:[UIImage imageNamed:@"btn_answer"] forState: UIControlStateNormal];
    235         [answerButton setBackgroundImage:[UIImage imageNamed:@"btn_answer_highlighted"] forState: UIControlStateHighlighted];
    236        
    237         // 设置按钮点击事件,让按钮文字消失,相应的选项恢复
    238         [answerButton addTarget:self action:@selector(onAnswerClicked:) forControlEvents:UIControlEventTouchUpInside];
    239        
    240         [self.answerView addSubview:answerButton];
    241     }
    242    
    243     [self.view addSubview:self.answerView];
    244 }
    245 
    246 /**
    247     设置按钮点击事件,让按钮文字消失,相应的选项恢复
    248 */
    249 - (void) onAnswerClicked:(UIButton *) answerButton {
    250     // 1.设置答案标识
    251     self.isAnswerCompleted = NO;
    252    
    253     // 2.恢复相应的选项
    254     NSString *answerTitle = [answerButton titleForState:UIControlStateNormal];
    255     for (UIButton *optionButton in self.optionsView.subviews) {
    256         if ([answerTitle isEqualToString:[optionButton titleForState:UIControlStateNormal]]
    257             && optionButton.isHidden) {
    258             optionButton.hidden = NO;
    259             break;
    260         }
    261     }
    262    
    263     // 3.清除按钮上的文字
    264     [answerButton setTitle:nil forState:UIControlStateNormal];
    265    
    266     // 4.恢复答案文字颜色
    267     for (UIButton *answerButton in self.answerView.subviews) {
    268         [answerButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    269     }
    270 }
    271 
    272 /** 加入选项区 */
    273 - (void) addOptions:(Question *) question {
    274     // 6.1 删除旧选项
    275     [self.optionsView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    276    
    277     // 6.2 加入新选项
    278     int optionsCount = question.options.count;
    279     CGFloat optionWidth = 35;
    280     CGFloat optionHeight = 35;
    281     int columnCount = 7;
    282     CGFloat optionMargin = 10;
    283     CGFloat optionMarginLeft = (self.optionsView.frame.size.width - optionWidth * columnCount - optionMargin * (columnCount - 1)) / 2;
    284    
    285     for (int i=0; i<optionsCount; i++) {
    286         int rowNo = i / columnCount; // 当前行号,从0开始
    287         int columnNo = i % columnCount; // 当前列号,从0开始
    288         CGFloat optionX = optionMarginLeft + columnNo * (optionWidth + optionMargin);
    289         CGFloat optionY = rowNo * (optionHeight + optionMargin);
    290        
    291         UIButton *optionButton = [[UIButton alloc] initWithFrame:CGRectMake(optionX, optionY, optionWidth, optionHeight)];
    292        
    293         [optionButton setBackgroundImage:[UIImage imageNamed:@"btn_option"] forState:UIControlStateNormal];
    294         [optionButton setBackgroundImage:[UIImage imageNamed:@"btn_option_highlighted"] forState:UIControlStateHighlighted];
    295        
    296         [optionButton setTitle:question.options[i] forState:UIControlStateNormal];
    297        
    298         [optionButton addTarget:self action:@selector(onOptionClicked:) forControlEvents:UIControlEventTouchUpInside];
    299        
    300         [self.optionsView addSubview:optionButton];
    301     }
    302    
    303     [self.view addSubview:self.optionsView];
    304 }
    305 
    306 // 使点击到的选项消失 
    307 - (void) onOptionClicked:(UIButton *) optionButton {
    308     // 1.如果答案尚未填满,使选中的选项消失
    309     if (self.isAnswerCompleted) {
    310         return;
    311     }
    312    
    313     optionButton.hidden = YES;
    314    
    315     // 2.使消失的文字出现在答案区上,判断是否已经完成
    316     NSString *optionTitle = [optionButton titleForState:UIControlStateNormal];
    317    
    318     // 遍历答案按钮
    319     for (int i=0; i<self.answerView.subviews.count; i++) {
    320         // 已经遍历到了最后一个答案按钮,证明已经完成了所有答案
    321         if (i == self.answerView.subviews.count - 1) {
    322             self.isAnswerCompleted = YES;
    323         }
    324        
    325         UIButton *answerButton = self.answerView.subviews[i];
    326         NSString *answerTitle = [answerButton titleForState:UIControlStateNormal];
    327        
    328         // 如果该答案按钮上没有文字,则是空,填入文字
    329         if (answerTitle.length == 0) {
    330             // 按钮默认的字体颜色是白色, 手动设为黑色
    331             [answerButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    332             [answerButton setTitle:optionTitle forState:UIControlStateNormal];
    333            
    334             break;
    335         }
    336     }
    337    
    338     [self dealWithAnswer];
    339 }
    340 
    341 /** 处理答案 */
    342 - (void) dealWithAnswer {
    343     if (self.isAnswerCompleted) {
    344         Question *question = self.questions[self.index];
    345         NSMutableString *answerStr = [NSMutableString string];
    346        
    347         // 拼接已经完成的答案
    348         for (UIButton *completedAnswerButton in self.answerView.subviews) {
    349             [answerStr appendString:[completedAnswerButton titleForState:UIControlStateNormal]];
    350         }
    351        
    352         // 如果答对了
    353         if ([answerStr isEqualToString:question.answer]) {
    354             // 答案字体转换称为蓝色
    355             for (UIButton *correctAnswerButton in self.answerView.subviews) {
    356                 [correctAnswerButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    357             }
    358            
    359             // 延迟指定时间后跳入下一题
    360             [self performSelector:@selector(onNextImgButtonClicked) withObject:nil afterDelay:0.5];
    361            
    362             // 加分
    363             [self calScore:1000];
    364         }
    365         else {
    366             for (UIButton *correctAnswerButton in self.answerView.subviews) {
    367                 // 答案字体转换称为红色
    368                 [correctAnswerButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    369             }
    370         }
    371     }
    372 }
    373 
    374 /** 原图状态点击放大,大图状态点击恢复原状 */
    375 - (IBAction)onImageClicked {
    376     // 使用遮盖是否存在判断图片状态
    377    
    378     // 1.遮盖不存在,放大图片
    379     if (nil == self.cover) {
    380         [self onEnlargeImgButtonClicked];
    381     }
    382     else {
    383     // 2.遮盖存在,恢复图片
    384         [self smallImg];
    385     }
    386 }
    387 
    388 /** 计算分数 */
    389 - (void) calScore:(int) score {
    390     self.score += score;
    391     [self.scoreButton setTitle:[NSString stringWithFormat:@"%d", self.score] forState:UIControlStateNormal];
    392 }
    393 
    394 @end
     
    Question.h:
     1 //
     2 //  Question.h
     3 //  CrazyGuessGame
     4 //
     5 //  Created by hellovoidworld on 14/11/26.
     6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 
    11 @interface Question : NSObject
    12 
    13 @property(nonatomic, copy) NSString *answer;
    14 @property(nonatomic, copy) NSString *title;
    15 @property(nonatomic, copy) NSString *icon;
    16 @property(nonatomic, strong) NSArray *options;
    17 
    18 - (instancetype) initWithDictionary:(NSDictionary *) dictionary;
    19 + (instancetype) initWithDictionary:(NSDictionary *) dictionary;
    20 
    21 @end
     
    Question.m
     1 //
     2 //  Question.m
     3 //  CrazyGuessGame
     4 //
     5 //  Created by hellovoidworld on 14/11/26.
     6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
     7 //
     8 
     9 #import "Question.h"
    10 
    11 @implementation Question
    12 
    13 - (instancetype) initWithDictionary:(NSDictionary *) dictionary {
    14     if (self = [super init]) {
    15         self.title = dictionary[@"title"];
    16         self.icon = dictionary[@"icon"];
    17         self.answer = dictionary[@"answer"];
    18         self.options = dictionary[@"options"];
    19     }
    20    
    21     return self;
    22 }
    23 
    24 + (instancetype) initWithDictionary:(NSDictionary *) dictionary {
    25     return [[self alloc] initWithDictionary:dictionary];
    26 }
    27 
    28 @end
     
     
  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/hellovoidworld/p/4127572.html
Copyright © 2011-2022 走看看