博客相关资源 :
项目创建流程 : ① 选择 Create a new Xcode project , ② 创建 Single View Application 项目 , ③ 设置项目信息 , ④ 设置代码路径并创建 ;
Create a new Xcode project
选项 ;
Choose a template for your new project
对话框中 , 选择项目类型 iOS -> Application -> Single View Application 项目 ;
Create
按钮, 创建项目 ;
界面设置 : 需要自己手动设定一个 屏幕尺寸 ;
添加按钮事件 :
- (IBAction)generateView {
}
修改按钮文字 :
代码生成 UIView 控件 :
//1. 创建 View 控件 , 使用 alloc init 方法
UIView * newView = [[UIView alloc] init];
//2. 修改 控件 的 Frame 属性
newView.frame = CGRectMake(100, 100, 100, 100);
//3. 为 控件 设置一个颜色值
newView.backgroundColor = [UIColor redColor];
//4. 将 控件 添加到 View 中
[self.view addSubview:newView];
//
// ViewController.m
// 1.GenerateUIViewByCode
//
// Created by octopus on 19/2/3.
// Copyright © 2019年 han. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)generateView {
//1. 创建 View 控件 , 使用 alloc init 方法
UIView * newView = [[UIView alloc] init];
//2. 修改 控件 的 Frame 属性
newView.frame = CGRectMake(100, 100, 100, 100);
//3. 为 控件 设置一个颜色值
newView.backgroundColor = [UIColor redColor];
//4. 将 控件 添加到 View 中
[self.view addSubview:newView];
}
@end
运行并查看效果 :
Build and then run the current scheme
按钮 , 运行虚拟机 ; 然后点击 10 次 生成 10 个 UIView 控件 ;
Debug View Hierarchy
按钮 , 即可查看 View 层次 ;
代码生成 按钮 :
//1. 创建 某种 Type 的 按钮 , 这里创建 UIButtonTypeCustom 类型的 按钮
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
CGRectMake
方法创建 CGRect 结构体变量 , 并赋值给 按钮的 frame
属性 ; //2. 设置 Frame 属性
button.frame = CGRectMake(100, 100, 100, 100);
setTittle
方法 , 设置生成的按钮的文字 ; //3. 设置 文字 , 这里需要根据不同的状态设置显示的文字 , 这里只设置 UIControlStateNormal 状态的文字
[button setTitle:@"生成按钮" forState:UIControlStateNormal];
setTittleColor
方法 , 设置按钮文字的颜色 ; //4. 设置 文字颜色 , 这里设置普通状态时的 文字 颜色
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
setBackgroundImage
方法 , 设置背景图片 ; //5. 设置 背景图片
[button setBackgroundImage:[UIImage imageNamed:@"button_bg"] forState:UIControlStateNormal];
addTarget
绑定该方法 ; //添加按钮事件
//5. 设置 背景图片
[button setBackgroundImage:[UIImage imageNamed:@"button_bg"] forState:UIControlStateNormal];
// 创建的按钮事件
//为 生成的 按钮 绑定 点击事件
- (void) bindMethod{
NSLog(@"绑定事件触发");
}
self.view
, 调用父控件的 addView
方法 添加控件 ; //7. 将 UIButton 添加到 根 View 中
[self.view addSubview:button];
//
// ViewController.m
// 1.GenerateUIViewByCode
//
// Created by octopus on 19/2/3.
// Copyright © 2019年 han. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
//该方法在 UIViewController 创建完成 , 并开始加载到内存中时 , 在这个时刻执行该 viewDidLoad 方法
//一般情况下 是 在该方法中 执行 初始化数据 , 创建控件 等操作 ;
- (void)viewDidLoad {
[super viewDidLoad];
//1. 创建 某种 Type 的 按钮 , 这里创建 UIButtonTypeCustom 类型的 按钮
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
//2. 设置 Frame 属性
button.frame = CGRectMake(100, 100, 100, 100);
//3. 设置 文字 , 这里需要根据不同的状态设置显示的文字 , 这里只设置 UIControlStateNormal 状态的文字
[button setTitle:@"生成按钮" forState:UIControlStateNormal];
//4. 设置 文字颜色 , 这里设置普通状态时的 文字 颜色
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
//5. 设置 背景图片
[button setBackgroundImage:[UIImage imageNamed:@"button_bg"] forState:UIControlStateNormal];
//6. 绑定 事件
[button addTarget:self action:@selector(bindMethod) forControlEvents:UIControlEventTouchUpInside];
//7. 将 UIButton 添加到 根 View 中
[self.view addSubview:button];
}
//为 生成的 按钮 绑定 点击事件
- (void) bindMethod{
NSLog(@"绑定事件触发");
}
- (IBAction)generateView {
//1. 创建 View 控件 , 使用 alloc init 方法
UIView * newView = [[UIView alloc] init];
//2. 修改 控件 的 Frame 属性
newView.frame = CGRectMake(100, 100, 100, 100);
//3. 为 控件 设置一个颜色值
newView.backgroundColor = [UIColor redColor];
//4. 将 控件 添加到 View 中
[self.view addSubview:newView];
}
@end
创建 设置 应用 :
设置 Main.storyboard 界面 :
关联 ViewController.m 变量 :
生成子组件代码 :
//1. 创建 UILabel 类型子组件
UILabel * label = [[UILabel alloc] init];
//2. 设置 子组件 信息
label.text = @"生成的子组件";
//3. 设置 frame 属性 , 主要是设置 位置 和 大小 , 这里针对位置 设置一个随机位置
// 随机数使用 arc4random_uniform 是用于生成随机数的函数
label.frame = CGRectMake(arc4random_uniform(200), arc4random_uniform(280), 150, 20);
//4. 添加到 Container 中
[self.Container addSubview:label];
// 添加 子组件
// ① 添加组件 : 调用 父容器组件 的 addSubview 方法添加子组件
- (IBAction)generateView:(UIButton *)sender {
//1. 创建 UILabel 类型子组件
UILabel * label = [[UILabel alloc] init];
//2. 设置 子组件 信息
label.text = @"生成的子组件";
//3. 设置 frame 属性 , 主要是设置 位置 和 大小 , 这里针对位置 设置一个随机位置
// 随机数使用 arc4random_uniform 是用于生成随机数的函数
label.frame = CGRectMake(arc4random_uniform(200), arc4random_uniform(280), 150, 20);
//4. 添加到 Container 中
[self.Container addSubview:label];
}
删除子组件代码 :
self.Container.subviews
[view removeFromSuperview];
[view isKindOfClass:[UIButton class]]
//1. 获取所有的子组件数组 , 直接遍历删除每个子组件即可 , 注意不删除 UIButton 类型的组件
for(UIView * view in self.Container.subviews){
[view removeFromSuperview];
}
// 删除 子组件
// ① 删除方法 : 使用 removeFromSuperView 方法 来 删除控件
// ② 获取子组件 : 访问 父容器的 subViews 属性 即可获取 父容器所有的子组件, 该属性在 UIView 中定义
// ③ 判定组件类型 : 通过调用 [uiView isKindOfClass:[UIButton class]] 方法可以判断 uiView 是否是 UIButton 类型的组件
- (IBAction)clearView:(UIButton *)sender {
//1. 获取所有的子组件数组 , 直接遍历删除每个子组件即可 , 注意不删除 UIButton 类型的组件
for(UIView * view in self.Container.subviews){
[view removeFromSuperview];
}
}
删除指定 Tag 的控件 :
removeFromSuperview
方法 , 删除控件 ;- (IBAction)clearTag:(UIButton *)sender {
//1. 获取指定 Tag 的控件
UILabel * label1 = [self.Container viewWithTag:1];
UILabel * label2 = [self.Container viewWithTag:2];
UILabel * label3 = [self.Container viewWithTag:3];
//2. 删除 子控件
[label1 removeFromSuperview];
[label2 removeFromSuperview];
[label3 removeFromSuperview];
}
UIView 常用方法属性 :
效果展示 :
创建 设置 应用 :
设置 Main.storyboard 界面 :
关联 Main.storyboard 与 ViewController.m :
@interface
代码区域 , 在弹出的对话框中输入控件命令 和 选择控件类型 , 即可生成控件关联的变量 ;// 显示图片的索引
@property (weak, nonatomic) IBOutlet UILabel *indexLabel;
// 显示图片
@property (weak, nonatomic) IBOutlet UIImageView *Image;
// 左箭头按钮
@property (weak, nonatomic) IBOutlet UIButton *lastButton;
// 右箭头按钮
@property (weak, nonatomic) IBOutlet UIButton *nextButton;
// 图片介绍
@property (weak, nonatomic) IBOutlet UILabel *imageDescription;
@implementation
代码区域 , 在弹出的对话框中 输入方法名称 , 选择控件类型 , 选择触发操作 , 选择传入的参数 即可生成点击方法 ;// 上一张 图片
- (IBAction)lastImage:(UIButton *)sender {
}
// 下一张 图片
- (IBAction)nextImage:(UIButton *)sender {
}
UILabel 设置 :
Lines
属性 , 可以设置显示 几行 文字 , Lines 属性 设置 0 就会自动进行换行 ;UIButton 的启用 禁用 :
@property(nonatomic,getter=isEnabled) BOOL enabled; // default is YES. if NO, ignores touch events and subclasses may draw differently
NSArray 和 NSMutableDictionary 存储数据 :
// 用于保存所有图片数据的数组 , 每个数组元素存放字典数据
@property (strong, nonatomic) NSArray * pics;
NSMutableDictionary
字典 , 然后将字典 当做元素 放入 NSArray
数组中 , 数组中的每个元素都是一个 字典 ; // 1. 初始化图片名称数组
NSMutableDictionary * d1 = [NSMutableDictionary dictionary];
d1[@"pic"]=@"1_Mustang";
d1[@"des"]=@"Mustang(福特野马)是美国福特汽车公司推出的2005款野马汽车,最高时速232.2公里,设计源自2003 年汽车巡回展上的概念车,野马的诞生标志着美国仅存的大马力轿车获得了重生。";
NSMutableDictionary * d2 = [NSMutableDictionary dictionary];
d2[@"pic"]=@"2_Prado";
d2[@"des"]=@"普拉多是一款进口ORV,源于丰田享誉全球的LAND CRUISER车系,1996年丰田正式将LAND CRUISER FJ90命名为PRADO普拉多,即真正意义上的第一代普拉多。";
NSMutableDictionary * d3 = [NSMutableDictionary dictionary];
d3[@"pic"]=@"3_Camaro";
d3[@"des"]=@"雪佛兰 科迈罗(英文名:Chevrolet Camaro)设计于1960年,目前共发展了六代。1966年9月26日发布的1967款Camaro是以雪佛兰Nova为原型而设计的。";
NSMutableDictionary * d4 = [NSMutableDictionary dictionary];
d4[@"pic"]=@"4_LandCru";
d4[@"des"]=@"兰德酷路泽【陆地巡洋舰】是丰田汽车出品的LAND CRUISER 200,是丰田公司生产的一款进口ORV越野车(Off Road Vehicle) [1] ,它的外观在继承原有设计DNA的同时向具备新时代的“新鲜感·先进性”风格进化。是四轮驱动,轴距2850毫米,四轮碟刹的硬派越野车。";
NSMutableDictionary * d5 = [NSMutableDictionary dictionary];
d5[@"pic"]=@"5_Mondeo";
d5[@"des"]=@"福特蒙迪欧(Mondeo)是一款长安福特旗舰车型,不仅搭载多项创新科技,并在至臻品质、动力系统以及安全性能等方面实现全面提升。";
// 将字典放入数组中
self.pics = @[d1, d2, d3, d4, d5];
// ① 获取对应的数据 字典
NSMutableDictionary * d = self.pics[self.index - 1];
NSMutableDictionary * d
字典中的 “pic” 键 对应的值 d[@"pic"]
, 获取 字典 中 “des” 键 对应的值 d[@"des"]
代码逻辑 :
// 设置图片索引 , 注意不能 小于 1 , 边界控制
self.index -- ;
if(self.index <= 1){
self.index = 1;
}
...
// 设置图片索引 , 注意不能 超过 5 , 边界控制
self.index ++ ;
if(self.index >= self.pics.count){
self.index = (int)self.pics.count;
}
// 1. 设置按钮 禁用 启用 , index 为 1 和 5 时 分别启用 和 禁用 指定的按钮 , 其它情况下可以使用两个按钮
if(self.index == 1){
self.lastButton.enabled = NO;
self.nextButton.enabled = YES;
}else if(self.index == self.pics.count){
self.lastButton.enabled = YES;
self.nextButton.enabled = NO;
}else{
self.lastButton.enabled = YES;
self.nextButton.enabled = YES;
}
// ④ 设置 文字 描述
self.imageDescription.text = d[@"des"];
stringWithFormat
方法 , 设置一个 字符串格式 , 使用 通配符 进行 数据替换 ; 注意 NSArray 的 count 的通配符是 %lu ; // ② 设置提示 UILabel 文字 , 拼接字符串 , 1/5
self.indexLabel.text = [NSString stringWithFormat:@"%d/%lu", self.index, self.pics.count];
// ③ 设置 图片 显示
self.Image.image = [UIImage imageNamed:d[@"pic"]];
完整代码 :
//
// ViewController.m
// 3.ImageBrowser
//
// Created by octopus on 19/2/11.
// Copyright © 2019年 han. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
// 显示图片的索引
@property (weak, nonatomic) IBOutlet UILabel *indexLabel;
// 显示图片
@property (weak, nonatomic) IBOutlet UIImageView *Image;
// 左箭头按钮
@property (weak, nonatomic) IBOutlet UIButton *lastButton;
// 右箭头按钮
@property (weak, nonatomic) IBOutlet UIButton *nextButton;
// 图片介绍
@property (weak, nonatomic) IBOutlet UILabel *imageDescription;
// 当前图片索引
@property (assign, nonatomic) int index;
// 用于保存所有图片数据的数组 , 每个数组元素存放字典数据
@property (strong, nonatomic) NSArray * pics;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1. 初始化图片名称数组
NSMutableDictionary * d1 = [NSMutableDictionary dictionary];
d1[@"pic"]=@"1_Mustang";
d1[@"des"]=@"Mustang(福特野马)是美国福特汽车公司推出的2005款野马汽车,最高时速232.2公里,设计源自2003 年汽车巡回展上的概念车,野马的诞生标志着美国仅存的大马力轿车获得了重生。";
NSMutableDictionary * d2 = [NSMutableDictionary dictionary];
d2[@"pic"]=@"2_Prado";
d2[@"des"]=@"普拉多是一款进口ORV,源于丰田享誉全球的LAND CRUISER车系,1996年丰田正式将LAND CRUISER FJ90命名为PRADO普拉多,即真正意义上的第一代普拉多。";
NSMutableDictionary * d3 = [NSMutableDictionary dictionary];
d3[@"pic"]=@"3_Camaro";
d3[@"des"]=@"雪佛兰 科迈罗(英文名:Chevrolet Camaro)设计于1960年,目前共发展了六代。1966年9月26日发布的1967款Camaro是以雪佛兰Nova为原型而设计的。";
NSMutableDictionary * d4 = [NSMutableDictionary dictionary];
d4[@"pic"]=@"4_LandCru";
d4[@"des"]=@"兰德酷路泽【陆地巡洋舰】是丰田汽车出品的LAND CRUISER 200,是丰田公司生产的一款进口ORV越野车(Off Road Vehicle) [1] ,它的外观在继承原有设计DNA的同时向具备新时代的“新鲜感·先进性”风格进化。是四轮驱动,轴距2850毫米,四轮碟刹的硬派越野车。";
NSMutableDictionary * d5 = [NSMutableDictionary dictionary];
d5[@"pic"]=@"5_Mondeo";
d5[@"des"]=@"福特蒙迪欧(Mondeo)是一款长安福特旗舰车型,不仅搭载多项创新科技,并在至臻品质、动力系统以及安全性能等方面实现全面提升。";
// 将字典放入数组中
self.pics = @[d1, d2, d3, d4, d5];
// 2. 初始化索引 为 1 , 并且执行 第一次 图片 切换 操作 , 显示对应的 图片 , 索引 , 及 描述
self.index = 1;
[self showImage];
}
// 显示 上一张 图片
- (IBAction)lastImage:(UIButton *)sender {
// 设置图片索引 , 注意不能 小于 1 , 边界控制
self.index -- ;
if(self.index <= 1){
self.index = 1;
}
[self showImage];
}
// 显示 下一张 图片
- (IBAction)nextImage:(UIButton *)sender {
// 设置图片索引 , 注意不能 超过 5 , 边界控制
self.index ++ ;
if(self.index >= self.pics.count){
self.index = (int)self.pics.count;
}
[self showImage];
}
// 根据 当前的 索引值 显示指定的图片 , 以及控制 左右 切换按钮是否可用
- (void) showImage {
// 1. 设置按钮 禁用 启用 , index 为 1 和 5 时 分别启用 和 禁用 指定的按钮 , 其它情况下可以使用两个按钮
if(self.index == 1){
self.lastButton.enabled = NO;
self.nextButton.enabled = YES;
}else if(self.index == self.pics.count){
self.lastButton.enabled = YES;
self.nextButton.enabled = NO;
}else{
self.lastButton.enabled = YES;
self.nextButton.enabled = YES;
}
// 2. 设置 UIImageView 和 UILabel 切换
// ① 获取对应的数据 字典
NSMutableDictionary * d = self.pics[self.index - 1];
// ② 设置提示 UILabel 文字 , 拼接字符串 , 1/5
self.indexLabel.text = [NSString stringWithFormat:@"%d/%lu", self.index, self.pics.count];
// ③ 设置 图片 显示
self.Image.image = [UIImage imageNamed:d[@"pic"]];
// ④ 设置 文字 描述
self.imageDescription.text = d[@"des"];
}
@end
效果展示 :
Main.storyboard 添加流程 :
设置完毕后的情况 :
Storyboard 设置 :
新建 ViewController.m 文件 :
删除 Storyboard : 选中 Storyboard 点击 Delete 键 , 就会弹出如下对话框 , 提供了 三个选项 ;
Storyboard 本质 : 向 首界面 拖入 一个 UILabel , 并查看 该文件 ;
<label opaque="NO"
userInteractionEnabled="NO"
contentMode="left"
horizontalHuggingPriority="251" verticalHuggingPriority="251"
fixedFrame="YES" text="Hello" textAlignment="natural"
lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines"
adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO"
id="JUr-dt-qtd">
<rect key="frame" x="168" y="323" width="39" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
iOS 应用启动步骤 :
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
Bundle 简介 : 应用程序名称.app 是 Bundle , 是一个 目录 ;
NSLog(NSHomeDirectory());
打印出 沙盒路径 , 在 该路径 向后 退 两层 目录 , 可以看到 Bundle 目录 , Bundle 文件都在该 目录中 ;//打印出的路径示例
/Users/hanshuliang/Library/Developer/CoreSimulator/Devices/C7ECF957-38E2-4E3F-ADC1-1FC5D26B4C79/data/Containers/Data/Application/7128774A-7468-466B-9C44-962CF974F8CB
Bundle 路径 :
图片放置 位置 : 准备两张图片 , 分别放在 代码 根目录 和 Assets.xcassets 中 ;
NSBundle 使用 :
// 2. 获取当前应用程序的 Bundle
NSBundle *mainBundle = [NSBundle mainBundle];
// 3. 获取 Bundle 中 某文件 的 全路径
NSString *path = [mainBundle pathForResource:@"5_ Mondeo" ofType:@"jpeg"];
NSLog(path);
// 4. 获取 Bundle 中 某文件 的 全路径 , 使用另外一种方式
NSString *path1 = [mainBundle pathForResource:@"5_ Mondeo.jpeg" ofType:nil];
NSLog(path1);
2019-02-12 22:46:33.797 5.NSBundleDemo[3253:29735] /Users/hanshuliang/Library/Developer/CoreSimulator/Devices/C7ECF957-38E2-4E3F-ADC1-1FC5D26B4C79/data/Containers/Bundle/Application/C004925F-E20C-4122-A6E0-89D2D6B0CA7B/5.NSBundleDemo.app/5_ Mondeo.jpeg
2019-02-12 22:46:33.797 5.NSBundleDemo[3253:29735] /Users/hanshuliang/Library/Developer/CoreSimulator/Devices/C7ECF957-38E2-4E3F-ADC1-1FC5D26B4C79/data/Containers/Bundle/Application/C004925F-E20C-4122-A6E0-89D2D6B0CA7B/5.NSBundleDemo.app/5_ Mondeo.jpeg
PList 创建 :
获取 PList 数据 :
// 5. 获取 dictionary.plist 的 Bundle 路径
NSString *path2 = [mainBundle pathForResource:@"dictionary.plist" ofType:nil];
NSLog(path2);
// 6. 根据 PList 路径 初始化 字典 , 前提是 这个 PList 的类型是 字典类型的
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:path2];
PList 多种类型数据设置 : 上面 讲解 了 根元素 为 字典 的情况 , 这里讨论 根元素 为 数组 的情况 , 其中 数组的 每个元素 都可以设置 不同的类型 ;
// 7. 获取 array.plist 的 Bundle 路径
NSString *path3 = [mainBundle pathForResource:@"array.plist" ofType:nil];
NSLog(path3);
// 8. 根据 PList 路径 初始化 数组 , 前提是 这个 PList 的类型是 数组类型的
NSArray *array = [NSArray arrayWithContentsOfFile:path3];
使用 PList 存储数据 :
// 1. 获取 Bundle
NSBundle *mainBundle = [NSBundle mainBundle];
// 2. 获取 plist 文件路径
NSString *path = [mainBundle pathForResource:@"car.plist" ofType:nil];
// 3. 初始化数组
self.pics = [NSArray arrayWithContentsOfFile:path];
懒加载优化 :
@property (strong, nonatomic) NSArray * pics;
为例 , self.pics
相当于 get 方法 , 即调用了 -(NSArray *) pics;
方法 ; set 方法调用的是 -(void)setPics:(NSArray*)pics;
; 其实际的 变量名称 是 _pics
; 根据 用到 属性时 才去加载 原则 , 这里将加载过程放在 get 方法中 ;//懒加载优化 , 原则 1 : 只有使用 pics 属性时 开始优化 , 因此 代码 放在 get 方法中
- (NSArray *)pics {
// 懒加载优化 , 原则 2 : 只有 pics 属性为 空时 才开始从 list 中 初始化 数据
if(_pics == nil){
// 1. 获取 Bundle
NSBundle *mainBundle = [NSBundle mainBundle];
// 2. 获取 plist 文件路径
NSString *path = [mainBundle pathForResource:@"car.plist" ofType:nil];
// 3. 初始化数组 , 注意 此处要使用 生成的 变量名
_pics = [NSArray arrayWithContentsOfFile:path];
}
return _pics;
}
UIImageView 动画相关属性 :
@property (nullable, nonatomic, copy) NSArray<UIImage *> *animationImages;
// The array must contain UIImages. Setting hides the single image. default is nil
@property (nonatomic) NSTimeInterval animationDuration;
// for one cycle of images. default is number of images * 1/30th of a second (i.e. 30 fps)
@property (nonatomic) NSInteger animationRepeatCount;
// 0 means infinite (default is 0)
UIImageView 动画相关方法 :
- (void)startAnimating;
- (void)stopAnimating;
- (BOOL)isAnimating;
UIImageView 动画 执行流程 :
// 1. 先判断 动画是否在执行 , 如果动画在执行 , 直接退出方法
if([self.imageView isAnimating]) return;
// 2. 数据准备 , 准备 UIImage 数组
NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];
NSMutableArray *imageArray = [NSMutableArray array];
for(int i = 0; i < nameArray.count; i ++){
//获取 UIImage 对象 , 并放入数组
[imageArray addObject:[UIImage imageNamed:nameArray[i]] ];
}
// 3. 设置图片
self.imageView.animationImages = imageArray;
// 4. 设置动画参数 : 时长 , 循环次数
self.imageView.animationDuration = 1;
self.imageView.animationRepeatCount = 1;
// 5. 开始执行动画
[self.imageView startAnimating];
//播放动画的 方法
- (IBAction)startAnimation:(UIButton *)sender {
// 1. 先判断 动画是否在执行 , 如果动画在执行 , 直接退出方法
if([self.imageView isAnimating]) return;
// 2. 数据准备 , 准备 UIImage 数组
NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];
NSMutableArray *imageArray = [NSMutableArray array];
for(int i = 0; i < nameArray.count; i ++){
//获取 UIImage 对象 , 并放入数组
[imageArray addObject:[UIImage imageNamed:nameArray[i]] ];
}
// 3. 设置图片
self.imageView.animationImages = imageArray;
// 4. 设置动画参数 : 时长 , 循环次数
self.imageView.animationDuration = 1;
self.imageView.animationRepeatCount = 1;
// 5. 开始执行动画
[self.imageView startAnimating];
}
UIImageView 内存查看 :
UIImage 内存分析 :
UIImage *image = [UIImage imageNamed:@"1.png"];
//2.1获取 Bundle
NSBundle *mainBundle = [NSBundle mainBundle];
//2.2获取 图片对应的 Bundle 路径
NSString *path = [mainBundle pathForResource:nameArray[i] ofType:@"jpeg"];
//2.3根据 Bundle 路径 获取 UIImage
UIImage *image = [UIImage imageWithContentsOfFile:path];
内存优化后的 动画 执行流程 :
// 1. 先判断 动画是否在执行 , 如果动画在执行 , 直接退出方法
if([self.imageView isAnimating]) return;
// 2. 数据准备 , 准备 UIImage 数组
NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];
NSMutableArray *imageArray = [NSMutableArray array];
for(int i = 0; i < nameArray.count; i ++){
//2.1获取 Bundle
NSBundle *mainBundle = [NSBundle mainBundle];
//2.2获取 图片对应的 Bundle 路径
NSString *path = [mainBundle pathForResource:nameArray[i] ofType:@"jpeg"];
//2.3根据 Bundle 路径 获取 UIImage
UIImage *image = [UIImage imageWithContentsOfFile:path];
//2.4获取 UIImage 对象 , 并放入数组
[imageArray addObject:image ];
}
// 3. 设置图片
self.imageView.animationImages = imageArray;
// 4. 设置动画参数 : 时长 , 循环次数
self.imageView.animationDuration = 1;
self.imageView.animationRepeatCount = 1;
// 5. 开始执行动画
[self.imageView startAnimating];
//清除 UIImageView 的 动画图片
- (void) clearImage {
self.imageView.animationImages = nil;
}
// 6. 1秒后清除 动画图片
[self performSelector:@selector(clearImage) withObject:nil afterDelay:1];
//播放动画 并释放内存
- (IBAction)startAnimationReleaseMemory:(UIButton *)sender {
// 1. 先判断 动画是否在执行 , 如果动画在执行 , 直接退出方法
if([self.imageView isAnimating]) return;
// 2. 数据准备 , 准备 UIImage 数组
NSArray *nameArray = @[@"1_Mustang", @"2_Prado", @"3_Camaro", @"4_LandCru", @"5_Mondeo"];
NSMutableArray *imageArray = [NSMutableArray array];
for(int i = 0; i < nameArray.count; i ++){
//2.1获取 Bundle
NSBundle *mainBundle = [NSBundle mainBundle];
//2.2获取 图片对应的 Bundle 路径
NSString *path = [mainBundle pathForResource:nameArray[i] ofType:@"jpeg"];
//2.3根据 Bundle 路径 获取 UIImage
UIImage *image = [UIImage imageWithContentsOfFile:path];
//2.4获取 UIImage 对象 , 并放入数组
[imageArray addObject:image ];
}
// 3. 设置图片
self.imageView.animationImages = imageArray;
// 4. 设置动画参数 : 时长 , 循环次数
self.imageView.animationDuration = 1;
self.imageView.animationRepeatCount = 1;
// 5. 开始执行动画
[self.imageView startAnimating];
// 6. 1秒后清除 动画图片
[self performSelector:@selector(clearImage) withObject:nil afterDelay:1];
}
//清除 UIImageView 的 动画图片
- (void) clearImage {
self.imageView.animationImages = nil;
}
NSBundle pathForResource 为 nil 解决方案 :
效果展示 :
博客相关资源 :