一、开发前奏
1.公司标示使用反向域名:正向域名 www.baidu.com 用来标示一台网络主机;反向域名 cn.itcast.Mydemo 用来标示产品的,cn.com.abc.product。因为大家都喜欢好名字 weibo,所以就有新浪微博,腾讯微博。
2. Bundle Identifier: 产品唯一标示符;Bundle ID = 公司的反向域名 + 产品名
1> 在模拟器上面,只能有一个唯一的标示符的应用程序
2> 在AppStore上,所有的应用程序的Bundler ID都是唯一的Bundle ID 不支持中文,因此如果是上架产品,需要修改Bundle ID但是不影响开发。
3.开发步骤
1> 搭建界面 :a-》storyboard中拖控件搭建 b-》代码搭建
2> 连线 (代码搭建除外)
3> 编写代码
4.IBAction 和 IBOution
1> IBAction 用来和操作建立关系的,IBAction本质就是一个void,不过可以用来连线 => 方法
2> IBOutlet用来和界面上的元素建立关系,用来获得/修改界面控件的属性 => @property
用于设置storyboard的界面原名叫做Interface Builder,在OC中,与之相关的通常以IB开头,storyboard内部是xml格式。
5. UIViewController 和 UIView
UIViewController 负责程序的控制,大管家。UIView 负责界面的显示。每个UIViewController默认有一个view(根视图)
二、小知识点
1.IBAction的参数 - (IBAction)left:(UIButton *)button
1> 在OC中,绝大多数的控件监听方法的第一个参数就是控件本身
2> 默认连线时的参数类型是id
3> 如果要在监听方法中,更方便的使用控件,可以在连线时或者连线后,修改监听方法的参数类型
2.修改对象的结构体成员
在OC中,不允许直接修改“对象”的“结构体属性”的“成员”,但是允许修改“对象”的“结构体属性”
修改结构体属性的成员方法如下:
1> 使用临时变量记录对象的结构体属性
2> 修改临时变量的属性
3> 将临时变量重新设置给对象的结构体属性
3. 在程序开发中需要避免出现魔法数字(Magic Number) 魔法数字不利于其他程序员阅读代码
使用枚举类型,可以避免在程序中出现魔法数字
1> 枚举类型实质上就是一个整数,其作用就是用来替代魔法数字
2> 枚举类型中,指定了第一个整数之后,后面的数字会递增
4.控件(组件)的属性:frame 、 bounds 、 center、transform
1> frame可以修改对象的位置和尺寸; bounds可以修改对象的尺寸; center可以修改对象的位置
2> transform:在OC中,通过transform属性可以修改对象的平移、缩放比例和旋转角度
常用的创建transform结构体方法分两大类
1# 创建“基于控件初始位置”的形变
CGAffineTransformMakeTranslation(基于控件初始位置的移动)
CGAffineTransformMakeScale(基于控件初始尺寸的移动)
CGAffineTransformMakeRotation(基于控件初始弧度的旋转)
2# 创建“基于transform参数”的形变
CGAffineTransformTranslate(基于控件原有位置的移动)
CGAffineTransformScale(基于控件原有尺寸的缩放)
CGAffineTransformRotate(基于控件原有弧度的旋转)
补充:在OC中,所有跟角度相关的数值,都是弧度值,180° = M_PI
正数表示顺时针旋转
负数表示逆时针旋转
提示:由于transform属性可以基于控件的上一次的状态进行叠加形变,例如,先旋转再平移因此在实际动画开发中,当涉及位置、尺寸形变效果时,大多修改控件的transform属性,而不是frame、bounds、center
7.使用代码创建控件
在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力!
使用代码创建控件的步骤如下:
1> 使用控件对应类创建对象
2> 设置对象属性:frame\color\text\image\backgroundImage……
3> [self.view addSubview:btn];将控件添加到视图
设置控件监听方法的示例代码如下:
[btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
注意:
1> addTarget方法定义在UIControl类中,这意味着可以给所有继承自UIControl类的对象添加监听方法
2> 监听方法的第一个参数就是对象本身
3> 监听方法的第二个参数是监听控件的事件
8. viewDidLoad (使用代码创建控件在viewDidLoad方法中完成)
viewDidLoad是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作
在viewDidLoad方法中,一定不要忘记调用父类的方法实现!
[super viewDidLoad];
9.手码懒加载创建控件的步骤
1> 定义控件属性,注意:属性必须是strong的,示例代码如下:
@property (nonatomic, strong) UIImageView *icon;
2> 在属性的getter方法中实现懒加载,示例代码如下:
- (UIImageView *)icon
{
if (!_icon) {
// 计算位置参数
CGFloat imageW = 200;
CGFloat imageX = (320 - imageW) / 2;
CGFloat imageH = 200;
CGFloat imageY = 80;
// 实例化图像视图
_icon = [[UIImageView alloc] initWithFrame:CGRectMake(imageX, imageY, imageW, imageH)];
// 将图像视图添加到主视图
[self.view addSubview:_icon];
}
return _icon;
}
使用懒加载的好处:
1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强
2> 每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合
10.使用Plist文件
使用Plist文件的目的:将数据与代码分离
加载方法:
NSString *path = [[NSBundle mainBundle] pathForResource:@"ImageData" ofType:@"plist"];
_imageList = [NSArray arrayWithContentsOfFile:path];
提示:通常在方法中出现File字眼,通常需要传递文件的全路径作为参数
11. Images.xcassets中的素材
1> 只支持png格式的图片
2> 图片只支持[UIImage imageNamed]的方式实例化,但是不能从Bundle中加载
3> 在编译时,Images.xcassets中的所有文件会被打包为Assets.car的文件
12. UIImageView的序列帧动画
// 0. 是否正在动画
[self.tom isAnimating];
// 1. 设置图片的数组
[self.tom setAnimationImages:arrayM];
// 2. 设置动画时长,默认每秒播放30张图片
[self.tom setAnimationDuration:arrayM.count * 0.075];
// 3. 设置动画重复次数,默认为0,无限循环
[self.tom setAnimationRepeatCount:1];
// 4. 开始动画
[self.tom startAnimating];
// 5. 动画播放完成后,清空动画数组
[self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration];
13. UIImage imageNamed
在图片使用完成后,不会直接被释放掉,具体释放时间由系统决定,适用于图片小,常用的图像处理
如果要释放快速释放图片,可以使用[UIImage imageWithContentsOfFile:path]实例化图像
14.方法重构的策略
1> 将具有共性的代码复制到一个新的方法
2> 根据不同的调用情况,增加方法的参数
提示:在写程序时不要着急重构,有时候把代码先写出来,更容易看清楚如何重构才会更好!
15. Bundle中的图片素材
往项目中拖拽素材时,通常选择
1> Destination: 勾选
2> Folders:
选择第一项:黄色文件夹
Xcode中分文件夹,Bundle中所有所在都在同一个文件夹下,因此,不能出现文件重名的情况
特点:
*** 可以直接使用[NSBundle mainBundle]作为资源路径,效率高!
*** 可以使用[UIImage imageNamed:]加载图像
选择第二项:蓝色文件夹
Xcode中分文件夹,Bundle中同样分文件夹,因此,可以出现文件重名的情况
特点:
*** 需要在[NSBundle mainBundle]的基础上拼接实际的路径,效率较差!
*** 不能使用[UIImage imageNamed:]加载图像
16.文件管理
[NSFileManager defaultManager]
常用方法
1> 判断文件是否存在
- (BOOL)fileExistsAtPath:(NSString *)path;
2> 将文件从源路径复制到目标路径
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
3> 删除文件
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
4> 返回指定路径中的文件列表
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error ;