作者声明
因个人能力问题,文中不免会有错误之处,欢迎各位读者交流,批评,指正。
摘要
通过一个实例:Tom猫(没有声音)来学习uiimageview的基本使用。
实例
viewController h代码
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *Tom;
- (IBAction)butClick:(UIButton *)sender;
@end
viewController m代码
//
// ViewController.m
// Tom猫
//
// Created by dqw on 15/5/8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
{
// 定义多个方法使用的变量。
NSDictionary *_imageCounts;
}
@end
@implementation ViewController
#pragma mark 1. 加载plist里面的图片个数。
- (void)viewDidLoad {
[super viewDidLoad];
// 提取每种动作的图片个数。
NSBundle *bundle = [NSBundle mainBundle];
#pragma mark [bundle path...]的一个小知识点。
// 注意这样的表达也是可以的。
NSString *path = [bundle pathForResource:@"Image Count.plist" ofType:nil];
_imageCounts = [NSDictionary dictionaryWithContentsOfFile:path];
}
#pragma mark 定义动画播放方法。
- (void)playAnimation:(NSString*)AnimationName :(int)Duration
{
// 如果当前正在进行动画,则不进行其它操作。
if ([_Tom isAnimating])return;
#pragma mark 注意点1: 初始化。
NSMutableArray *images = [NSMutableArray array];
for (int i = 0; i < [_imageCounts[AnimationName] intValue]; i++) {
#pragma mark 重点1:图片名字0x的格式。
NSString *imageName = [NSString stringWithFormat:@"%@_%02d.jpg", AnimationName, i];
#pragma mark 重点2:关于图片的内存存放位置
// 第一种方法,图片被调用以此后就存放在缓存中,缓存也属于内存,这样在程序的运行过程中会占用大量内存。
// 第二中方法,图片使用完后就被释放掉了,所以测内存的时候,可以看到内存的使用量不会随着点击的次数而增大。
// 但是,视频中,老师的实例占用内存也就是2 3M的样子,我的实例内存都达到100duoM.
#pragma mark 疑问1:运行时的内存和视频中老师的相差很大??
// UIImage *image = [UIImage imageNamed:imageName];
//
// [images addObject:image];
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:imageName ofType:nil];
UIImage *image = [UIImage imageWithContentsOfFile:path];
[images addObject:image];
}
// 设置动画。
_Tom.animationImages = images;
_Tom.animationDuration = Duration;
_Tom.animationRepeatCount = 1;
[_Tom startAnimating];
}
- (IBAction)butClick:(UIButton *)sender {
#pragma mark 注意点2: 初始化。
// 这样的尝试说明基础掌握的不扎实,没必要创建字符串实例的,只需要顶一个指针即可。
// NSString *temp = [[NSString alloc]init];
// NSString *animationName = [NSString stringWithString:[sender titleForState:UIControlStateNormal]];
NSString *animationName = [sender titleForState:UIControlStateNormal];
int imageCount = [_imageCounts[animationName] intValue];
NSLog(@"%@", [sender titleForState:UIControlStateNormal]);
int duration = 0.1 * imageCount;
[self playAnimation:animationName :duration];
}
@end
重点 难点 注意点
- uiimageview的两种加载图片方法,一个存在缓存,一个用完即释放。※
- bundle得到文件路径的一个小知识点: NSString *path = [bundle pathForResource:imageName ofType:nil];
- 类似01 35这样的图片名字的字符串表达方法。
- 用到变量的初始化,要不要alloc init。
疑问
- 运行时的内存和老师的实例相比大了很多?
- image count plist 里面,只有字典元素的value让选择类型,而key则没有,难道其key默认是string类型么?
待完善的内容
- uiimageview动画相关拓展。