首页 > 代码库 > iOS-UI基础小计-01

iOS-UI基础小计-01

一、开发前奏

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属性,而不是frameboundscenter

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 ;