Hello IOS
这些官方的文档都是有必要去看的
- 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基本概念
- IOS APP 的代码结构
main()
UIApplicationMain()
UIApplication
对象UIApplicationDelegate
-
IOS APP的运行环境
- SandBox(沙盒)
-
运行期目录结构
NSHomeDirectory()
Bundle
每个IOS应用都是一个Bundle
-
Bundle
:带一个info.plist
的目录 -
NSBundle
类:通过这个类,可以读取info.plist
里的信息,也可以访问Bundle
里的资源 -
mainBundle
:应用程序本身的一个Bundle
,要读取应用里预先打包好的资源,就要从NSBundle
,mainBundundle
里去访问它。-
Resourcebundle
和framework
都可以嵌在mainBundle
里,framework
是一个特殊的bundle
,它里面的资源是一个动态库。
-
大部分时间,我们不直接跟UIApplication
打交道而是使用 AppDelegate
打交道
Button
写程序时要将界面与代码分离
可以只用代码来描绘界面及响应用户操作
但是:不够直观,调整麻烦
- IOS解决方案:
- 用
interfaceBuilder
画出界面 - 保存到
xib
(xml
版的nib
)文件 - 用代码更新界面、响应用户操作
- 保存在
.m
文件
- 用
InterfaceBuilder
画出的界面代码保存在.m
文件内
tip:xib
和nib
的ib
就是InterfaceBuilder
的缩写
但是这会有两个麻烦
- 界面操作怎么指定响应代码?
- 代码怎么引用界面元素?
解决方案
Outlet
-
为了让代码能引用
nib
中创建的对象- 需要代码里有一个变量来引用界面对象
- 在界面对象创建后,给这个变量赋值
- 这个过程最好能自动完成
-
Outlet
-
IBOutlet
标记的变量
-
Connection
要做到这点,要给变量上加上一个修饰符<IBOutlet>
,这个修饰本身没有实际意义(可以看成是一个另类的viod
),只是一个标记。但是会告诉Xcode,这个变量是比较特别的。
Outlet
是一个变量,带有Outlet
标记
Outlet Connection
是一个在Nib
对象创建之后,通过Nib
里的定义,在运行时把它和Outlet
关联起来的一个机制
通常会说这个Outlet
是这个Nib
的referenceingoutlet
Action Connection
-
界面事件
-
Interface Builder
,ConnectionInspector
-
-
关联响应代码
- 用
IBAction
标记的方法
- 用
** 关联:界面对象.事件=> 类实例.方法 **
他也是个Connection
,但是他的类型是Action
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
//可以将UpInside
和OutInside
OR在一起,再把Eventmask
传给forControlEvents:
//
btn
里当这个对象出现时,去调用哪个对象(Target:self
)的哪个方法(action
)
Image
Assert Catalog 图片管理
- 片匡切割
- 属性面板——>最底下——>sllclng
- 具有处理矢量图的能力,矢量图在缩放上有很大优势
用UIImageView方式显示图片
- 代码里,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
表示要用多少时间加载完这组图片。
缺少过渡动画的问题:
如果想要过渡动画可以增加文件的帧数。
猜城市
- UI:我们看的见得部分
- ViewController:
- 把内部的状态展示在界面上
- 把用户在界面上的操作整理成一条消息,发给程序主体(也就是
game
对象) -
ViewController
找Game
要城市的图片、当前进展、游戏有没有结束、把用户 提供的名字发给”猜“的的方法
- GameLevel:每个城市都封装成一个游戏关卡,猜对了就可以进入下一关。
- City :每一个关卡都会有一个
city
对象,城市有名字,ID
。- 有
ID
是因为最后要把图片加载到内存里 - 通过一个
CityDB
对象把图片封装起来 - 为什么不直接在
Game
里写代码?如果以后想加更多的city
,就不适合用直接在代码里硬编码的方式。 -
CityDB
实际只保留了一组对city
对象的引用,其实里面没有图片,只有city
的ID
和名字。
- 有
- UIImage:把
CityDB
文件放在Image
里,每个文件是city+id.jpg
-
cityDB
编译时,给了Game
一个city
的数组,当Game
找cityDB
要城市图片时,cityDB
把ID
取出,拼city+id
,然后UIImage
从文件内把图片读取进来。
-
- Game分两块:
- 初始化:用
shuffleCities
随机给每个GameLevel
创建出一个城市 - 进入游戏:
- 当用户的一个动作(猜+名字参数)通过
ViewController
把消息发给Game
时 -
GuessWithName
方法开始工作:- 比较
Name
猜对了没 - 根据比较
Name
的结果,调用updateScore
(等级计算)方法
- 比较
- 当用户的一个动作(猜+名字参数)通过
- 初始化:用
- GameLevel
- 把用户的一次猜测封装成一个猜测对象,注册到
GameLevel
里,然后判断GameLevel
的Guess
次数是否达到上限,如果达到上限就失败并进入下一关,成功也进入下一关。 - 在
GameLevel
里还有一个游戏有没有玩到最后一关的判断
- 把用户的一次猜测封装成一个猜测对象,注册到