GeekBand-IOS实战-第一周

Hello IOS


这些官方的文档都是有必要去看的

  1. IOS总纲—可以以后回过头看
  • 界面基础

    • View controllerprogrammingguide
    • View controllercatalog
    • View programmingguide
    • UIKituserinterfacelcatalog
    • Event handlingguide
  • 图形和动画

    • Drawing and printing guide
    • Concurrency programmingguide
    • Quartz 2D programmingguide
    • Core animationprogrammingguide
  • 网络与存储

    • Network & Internet staring point — 知道方向
    • Network overview— 了解概念
    • Data managementstartingpoint— 知道方向
  • 等到真正要上手干活了,下面这些文档是必须要看的

    • Auto layout guide
    • Scroll view programmingguide
    • Table viewprogrammingguide
    • Collection viewprogrammingguide

要养成写 include 的习惯

APP基本概念

  1. IOS APP 的代码结构
  • main()

  • UIApplicationMain()

  • UIApplication对象

  • UIApplicationDelegate

  • IOS APP的运行环境

    • SandBox(沙盒)
  • 运行期目录结构

    • NSHomeDirectory()

Bundle

每个IOS应用都是一个Bundle
  • Bundle:带一个info.plist的目录
  • NSBundle类:通过这个类,可以读取info.plist里的信息,也可以访问Bundle里的资源
  • mainBundle:应用程序本身的一个Bundle,要读取应用里预先打包好的资源,就要从NSBundlemainBundundle里去访问它。
    • Resourcebundleframework都可以嵌在mainBundle里,framework是一个特殊的bundle,它里面的资源是一个动态库。
GeekBand-IOS实战-第一周_第1张图片
UIApplication

大部分时间,我们不直接跟UIApplication打交道而是使用 AppDelegate 打交道


Button

写程序时要将界面与代码分离
可以只用代码来描绘界面及响应用户操作
但是:不够直观,调整麻烦

  • IOS解决方案:
    • interfaceBuilder画出界面
    • 保存到xib(xml版的nib)文件
    • 用代码更新界面、响应用户操作
    • 保存在.m文件

InterfaceBuilder画出的界面代码保存在.m 文件内

tip:xibnibib就是InterfaceBuilder的缩写

但是这会有两个麻烦
  • 界面操作怎么指定响应代码?
  • 代码怎么引用界面元素?
解决方案
Outlet
  • 为了让代码能引用nib中创建的对象

    • 需要代码里有一个变量来引用界面对象
    • 在界面对象创建后,给这个变量赋值
    • 这个过程最好能自动完成
  • Outlet

    • IBOutlet标记的变量
  • Connection

GeekBand-IOS实战-第一周_第2张图片
Outlet

要做到这点,要给变量上加上一个修饰符,这个修饰本身没有实际意义(可以看成是一个另类的viod),只是一个标记。但是会告诉Xcode,这个变量是比较特别的。

Outlet 是一个变量,带有Outlet标记
Outlet Connection 是一个在Nib对象创建之后,通过Nib里的定义,在运行时把它和Outlet关联起来的一个机制
通常会说这个Outlet是这个Nibreferenceingoutlet


Action Connection
  • 界面事件

    • Interface BuilderConnectionInspector
  • 关联响应代码

    • IBAction标记的方法

** 关联:界面对象.事件=> 类实例.方法 **

GeekBand-IOS实战-第一周_第3张图片
Action Connection

他也是个Connection,但是他的类型是Action


Placeholder用来在文本框内做一些提示信息(切勿滥用)

GeekBand-IOS实战-第一周_第4张图片
Placeholder

Touch Up Inside: 在事件内部点击放开
Touch Up Outside:在事件内部点击,移动到外面放开(如微信的取消语音录制功能)


UIButton
  • 类型
  • Custom -可以设图标,可以设文字,可以该样式
  • System 默认风格 — 在Button里的Type可以更改样式
  • 状态
    • Normal (正常状态)
    • Highlighted (按下去的状态)
    • Selected
    • Disabled
  • 文字与图片
  • 背景

除了用拖动图标的方式创建Button,还可以纯代码来创建

当需要在Button的响应代码内用代码创建另一个Button时,不要忘记在创建之前写上 [super viewDidLoad];

  • 创建Button

    • UIButton*btn= [Uibutton buttonWithType:UIButtonTypeCustom]
      //构造Button实例的类方法
  • 设置属性

    • [btn setBackgroundImage:[UIImage imageNamed:@"okbtn"] forState:UIControlStateNormal];
      //设置BackgroundImage

    • [btn setTitle:@"OK" forState:UIControlStateNoemal];
      //设置Title

    • [btn setTitleColor:[UIColor redColor] forState: UIContorlStateNormal];
      //设置TitleColor

    ** 不要忘了那个forState **

  • 添加响应

    • [btn addTarget : self action: @selector(greeting:) forControlEvents: UIConteolEventTouchUpInside];
      //Tergetaction 模式

    • Event mask:UIControlEnentTouchUpInside|UIControlEvenTouchUpOutside
      //可以将UpInsideOutInside OR在一起,再把Eventmask传给forControlEvents:

    //btn里当这个对象出现时,去调用哪个对象(Target:self)的哪个方法(action)


Image

Assert Catalog 图片管理
  1. 片匡切割
  • 属性面板——>最底下——>sllclng
  • 具有处理矢量图的能力,矢量图在缩放上有很大优势
用UIImageView方式显示图片
  1. 代码里,UIImageView也是一个View。
  • 代码里的 .image 属性,给他赋值,他就有图片了
    • interfaceBuilde选择图片
    • 图片打包在mainBundle
    • 系统会自动缓存图片(即使ImageView消失,内存也不会释放)
用UIImage类在代码里加载图片
mainBundle里加载

Image = [UIImage imageNamed:@""];//会自动选用mainBundle里的图片

Image = [UIImage imageNamed:@"" inBundle:nil compatibleWithTraitCollection:nil];//如果用自己打包好的图片,就需要加上后面两个参数。

// 上面两种方法会自动缓存

Uiimage *image = [UIImage imageWithContentsOfFile:url.path];//用这个方法就不会被自动加载,但是要先获得图片的url,获取代码如下。
NSURL *url = [[NSBundle mainBundle] URLForResource:@"mypic" withExtension:@"png"];

从文件内加载

UIImage *image = [UIImage imageWIthContentsOfFile:path];//只要是能访问到的文件,都能加载进来。

UIImage *image = [UIImage imageWithData:data];//从网上读取的一组数据,已经放在NSData里了,就可以用imageWithData 把它构建成一个image

动画

用以下方法获取的图片
UIImage *image = [UIImage animatedImageNamed:@"vectanim" duration:1.0];
图片序列不写数字,如:vectanim1后面的1就不用写。

animatedImageNamed会把名为vectanim的序列图片都加载

duration表示要用多少时间加载完这组图片。

缺少过渡动画的问题:
如果想要过渡动画可以增加文件的帧数。


猜城市

GeekBand-IOS实战-第一周_第5张图片
模型设计
  1. UI:我们看的见得部分
  • ViewController:
    • 把内部的状态展示在界面上
    • 把用户在界面上的操作整理成一条消息,发给程序主体(也就是game对象)
    • ViewControllerGame要城市的图片、当前进展、游戏有没有结束、把用户 提供的名字发给”猜“的的方法
  • GameLevel:每个城市都封装成一个游戏关卡,猜对了就可以进入下一关。
  • City :每一个关卡都会有一个city对象,城市有名字,ID
    • ID是因为最后要把图片加载到内存里
    • 通过一个CityDB对象把图片封装起来
    • 为什么不直接在Game里写代码?如果以后想加更多的city,就不适合用直接在代码里硬编码的方式。
    • CityDB实际只保留了一组对city对象的引用,其实里面没有图片,只有cityID和名字。
  • UIImage:把CityDB文件放在Image里,每个文件是city+id.jpg
    • cityDB编译时,给了Game一个city的数组,当GamecityDB要城市图片时,cityDBID取出,拼city+id,然后UIImage从文件内把图片读取进来。
  • Game分两块:
    • 初始化:用shuffleCities随机给每个GameLevel创建出一个城市
    • 进入游戏:
      • 当用户的一个动作(猜+名字参数)通过ViewController把消息发给Game
      • GuessWithName方法开始工作:
        • 比较Name猜对了没
        • 根据比较Name的结果,调用updateScore(等级计算)方法
  • GameLevel
    • 把用户的一次猜测封装成一个猜测对象,注册到GameLevel里,然后判断GameLevelGuess次数是否达到上限,如果达到上限就失败并进入下一关,成功也进入下一关。
    • GameLevel里还有一个游戏有没有玩到最后一关的判断

你可能感兴趣的:(GeekBand-IOS实战-第一周)