您的位置:首页 > 移动开发 > IOS开发

iOS工作记录7 :ios控件加载图片,plist,懒加载,序列帧动画,添加动画效果(实用例子)

2014-11-26 09:44 661 查看
控件加载图片,plist,懒加载,序列帧动画,添加动画效果。

IOS中有2种加载图片的方式、

方式一:有缓存(图片所占用的内存会一直停留在程序中)

+ (UIImage *)imageNamed:(NSString *)name;

注:必须是png文件。需要把图片添加到 images.xcassets中

例如:

@property (weak, nonatomic) IBOutlet UIImageView *iconImageView;

self.iconImageView.image=[UIImage imageNamed:@"icon"];

方式二:无缓存(图片所占用的内存会在一些特定操作后被清除)

.jpg格式的图片只能用无缓存方式加载

[objc] view
plaincopy





+ (UIImage *)imageWithContentsOfFile:(NSString *)path

- (id)initWithContentsOfFile:(NSString *)path;

path是图片的全路径

其中又有:分组方式使用图片和不分组方式使用图片

分组方式导入的图片是蓝色的文件夹,创建UIImage时,需要完整的路径名(mainBundle +图片名字)

不分组方式导入的图片是黄色的文件夹,创建UIImage时,不需要完整的路径名(mianBundle+路径名+图片名字)

例如:

[objc] view
plaincopy





/* 不分组方式来使用图片 文件夹颜色为黄色。路径为 mainBundle/图片名字.后缀*/

NSString *imgName=@"icon.jpg";

// NSString *imgpath=[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:imgName];

// 与下面这句效果相同

NSString *imgpath=[[NSBundle mainBundle] pathForResource:imgName ofType:nil];

UIImage *image=[UIImage imageWithContentsOfFile:imgpath];

/* 分组方式来使用图片 文件夹颜色为蓝色色。路径为 mainBundle/图片所在路径/图片名字.后缀*/

// 使用另外一种方式来读取图片

NSString *bundlePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Animations副本"];

NSString *animPath = [bundlePath stringByAppendingPathComponent:imgName];

UIImage *image = [UIImage imageWithContentsOfFile:animPath];

注: 有缓存的图片不能用无缓存的方式加载

plist:

一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种属性列表文件的扩展名是plist,因此也成为“Plist文件”

[objc] view
plaincopy





// 获得Plist文件的全路径

NSBundle *bundle = [NSBundle mainBundle];

NSString *path = [bundle pathForResource:@"plistName" ofType:@"plist"];

//也可以

//NSString *path = [bundle pathForResource:@"plistName.plist" ofType:nil];

加载plist文件

[objc] view
plaincopy





NSArray pList=[NSArray arrayWithContentsOfFile:path];

加载后pList中的每个元素都会根据plist文件中给定的类型和数据来创建相应的元素。

一般使用plist文件加载后,会放如数据模型类中。方便提取数据

模型数据(例子)

[objc] view
plaincopy





LFAppInfo.m

#import "LFAppInfo.h"

@implementation LFAppInfo

-(instancetype)initWithPlist:(NSDictionary *)dict{

self.icon=dict[@"icon"];

self.name=dict[@"name"];

return self;

}

+(instancetype)appInfoWithPlist:(NSDictionary *)dict{

return [[self alloc] initWithPlist:dict];

}

@end

[objc] view
plaincopy





LFAppInfo.m

#import "LFAppInfo.h"

@implementation LFAppInfo

-(instancetype)initWithPlist:(NSDictionary *)dict{

self.icon=dict[@"icon"];

self.name=dict[@"name"];

return self;

}

+(instancetype)appInfoWithPlist:(NSDictionary *)dict{

return [[self alloc] initWithPlist:dict];

}

@end

懒加载:

懒加载主要就是2点:

1.写在get方法中(重写get方法)。

2.在get方法中,判断需要进行懒加载的变量,是否为nil

是,就加载。

否,就不需要加载。

此时,成员变量便只有在get方法调用时,加载数据。

之后再调用get方法时如果已经加载过数据了,就直接返回,不会重新再加载一次。

例如:

[objc] view
plaincopy





- (NSArray *)images

{

if (_images == nil) {

NSBundle *bundle = [NSBundle mainBundle];

NSString *path = [bundle pathForResource:@"imageData" ofType:@"plist"];

_images = [NSArray arrayWithContentsOfFile:path];

}

return _images;

}

序列帧动画

1.判断是否在执行动画的过程中,如果是,则直接返回,不执行后面的操作

2.制作一个数组。里面存放所需要播放的所有图片(UIImage)。

3.设置动画使用的图片数组,播放的次数,播放的时候,

4.开始播放

[objc] view
plaincopy





-(void)tomAnimation:(NSString *)img count:(int)count{

if([self.tom isAnimating]) return;

NSMutableArray *arrayImg=[NSMutableArray array];

for(int i=0;i<count;i++){

NSString *imgName=[NSString stringWithFormat:@"%@_%02d.jpg",img,i];

// NSString *imgpath=[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:imgName];

// 与下面这句效果相同

NSString *imgpath=[[NSBundle mainBundle] pathForResource:imgName ofType:nil];

UIImage *image=[UIImage imageWithContentsOfFile:imgpath];

[arrayImg addObject:image];

}

[self.tom setAnimationImages:arrayImg];

[self.tom setAnimationRepeatCount:1];

[self.tom setAnimationDuration:arrayImg.count*0.075];

[self.tom startAnimating];

[self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration];

}

添加动画效果

2种方式。

1.block方式(一般都使用这种方式)

[objc] view
plaincopy





[UIView animateWithDuration:duration delay:0.0 options:7 << 16 animations:^{

// 需要执行动画的代码

} completion:^(BOOL finished) {

// 动画执行完毕执行的代码

}];

2. 普通方法

[objc] view
plaincopy





[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:0.5];

<span style="white-space:pre"> </span>

<span style="white-space:pre"> </span>// 需要执行动画的代码

<span style="white-space:pre"> </span>

[UIView commitAnimations];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐