控件加载图片,plist,懒加载,序列帧动画,添加动画效果。

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

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

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

例如:

  1. @property (weak, nonatomic) IBOutlet UIImageView *iconImageView;
  2. self.iconImageView.image=[UIImage imageNamed:@"icon"];

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

  1. + (UIImage *)imageWithContentsOfFile:(NSString *)path
  2. - (id)initWithContentsOfFile:(NSString *)path;

path是图片的全路径
    其中又有:分组方式使用图片和不分组方式使用图片
    分组方式导入的图片是蓝色的文件夹,创建UIImage时,需要完整的路径名(mainBundle +图片名字)
    不分组方式导入的图片是黄色的文件夹,创建UIImage时,不需要完整的路径名(mianBundle+路径名+图片名字)

例如:

  1. /* 不分组方式来使用图片 文件夹颜色为黄色。路径为 mainBundle/图片名字.后缀*/
  2. NSString *imgName=@"icon.jpg";
  3. // NSString *imgpath=[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:imgName];
  4. // 与下面这句效果相同
  5. NSString *imgpath=[[NSBundle mainBundle] pathForResource:imgName ofType:nil];
  6. UIImage *image=[UIImage imageWithContentsOfFile:imgpath];
  7. /* 分组方式来使用图片 文件夹颜色为蓝色色。路径为 mainBundle/图片所在路径/图片名字.后缀*/
  8. // 使用另外一种方式来读取图片
  9. NSString *bundlePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Animations副本"];
  10. NSString *animPath = [bundlePath stringByAppendingPathComponent:imgName];
  11. UIImage *image = [UIImage imageWithContentsOfFile:animPath];

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

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

  1. // 获得Plist文件的全路径
  2. NSBundle *bundle = [NSBundle mainBundle];
  3. NSString *path = [bundle pathForResource:@"plistName" ofType:@"plist"];
  4. //也可以
  5. //NSString *path = [bundle pathForResource:@"plistName.plist" ofType:nil];

加载plist文件

  1. NSArray pList=[NSArray arrayWithContentsOfFile:path];

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

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

模型数据(例子)

  1. LFAppInfo.m
  2. #import "LFAppInfo.h"
  3. @implementation LFAppInfo
  4. -(instancetype)initWithPlist:(NSDictionary *)dict{
  5. self.icon=dict[@"icon"];
  6. self.name=dict[@"name"];
  7. return self;
  8. }
  9. +(instancetype)appInfoWithPlist:(NSDictionary *)dict{
  10. return [[self alloc] initWithPlist:dict];
  11. }
  12. @end
  1. LFAppInfo.m
  2. #import "LFAppInfo.h"
  3. @implementation LFAppInfo
  4. -(instancetype)initWithPlist:(NSDictionary *)dict{
  5. self.icon=dict[@"icon"];
  6. self.name=dict[@"name"];
  7. return self;
  8. }
  9. +(instancetype)appInfoWithPlist:(NSDictionary *)dict{
  10. return [[self alloc] initWithPlist:dict];
  11. }
  12. @end

懒加载:
懒加载主要就是2点:
1.写在get方法中(重写get方法)。
2.在get方法中,判断需要进行懒加载的变量,是否为nil
是,就加载。
否,就不需要加载。

此时,成员变量便只有在get方法调用时,加载数据。
之后再调用get方法时如果已经加载过数据了,就直接返回,不会重新再加载一次。

例如:

  1. - (NSArray *)images
  2. {
  3. if (_images == nil) {
  4. NSBundle *bundle = [NSBundle mainBundle];
  5. NSString *path = [bundle pathForResource:@"imageData" ofType:@"plist"];
  6. _images = [NSArray arrayWithContentsOfFile:path];
  7. }
  8. return _images;
  9. }

序列帧动画
   1.判断是否在执行动画的过程中,如果是,则直接返回,不执行后面的操作
        2.制作一个数组。里面存放所需要播放的所有图片(UIImage)。
        3.设置动画使用的图片数组,播放的次数,播放的时候,
        4.开始播放

  1. -(void)tomAnimation:(NSString *)img count:(int)count{
  2. if([self.tom isAnimating])  return;
  3. NSMutableArray *arrayImg=[NSMutableArray array];
  4. for(int i=0;i<count;i++){
  5. NSString *imgName=[NSString stringWithFormat:@"%@_%02d.jpg",img,i];
  6. // NSString *imgpath=[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:imgName];
  7. // 与下面这句效果相同
  8. NSString *imgpath=[[NSBundle mainBundle] pathForResource:imgName ofType:nil];
  9. UIImage *image=[UIImage imageWithContentsOfFile:imgpath];
  10. [arrayImg addObject:image];
  11. }
  12. [self.tom setAnimationImages:arrayImg];
  13. [self.tom setAnimationRepeatCount:1];
  14. [self.tom setAnimationDuration:arrayImg.count*0.075];
  15. [self.tom startAnimating];
  16. [self.tom performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.tom.animationDuration];
  17. }

添加动画效果
 2种方式。

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

  1. [UIView animateWithDuration:duration delay:0.0 options:7 << 16 animations:^{
  2. // 需要执行动画的代码
  3. } completion:^(BOOL finished) {
  4. // 动画执行完毕执行的代码
  5. }];

2. 普通方法

  1. [UIView beginAnimations:nil context:nil];
  2. [UIView setAnimationDuration:0.5];
  3. <span style="white-space:pre">    </span>
  4. <span style="white-space:pre">    </span>// 需要执行动画的代码
  5. <span style="white-space:pre">    </span>
  6. [UIView commitAnimations];

ios 图片的两种加载方式的更多相关文章

  1. 渐进式jpeg(progressive jpeg)图片及其相关 --图片的两种加载方式

    渐进式jpeg(progressive jpeg)图片及其相关   一.基本JPEG(baseline jpeg)和渐进JPEG 网络上那些色色的照片都是.jpg格式的("色色"指 ...

  2. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  3. Xamarin Android Fragment的两种加载方式

    android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...

  4. Linux驱动的两种加载方式过程分析

    一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...

  5. dll的两种加载方式(pend)+ delayload

    看过关于动态库的调用例子,于是决定动手做一做:dll的对外接口声明头文件,Mydll.h: //Mydll.h #include <stdio.h> #include <stdlib ...

  6. Qml文件的两种加载方式

    一种是QQmlApplicationEngine搭配Window,例如: #include <QGuiApplication> #include <QQmlApplicationEn ...

  7. Android Activity四种加载方式

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  8. Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  9. Android 四种加载方式详解(standard singleTop singleTask singleInstance) .

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

随机推荐

  1. MVC中使用EF+MySQL

    最近一段时间,想在EF中使用MySQL,于是就进行了测试. 我的环境是VS2013+EF6+MySQL5.7.4 首先要下载MySQL For VisualStudio 1.1.4.Connector ...

  2. C语言学习012:将代码文件分成多个文件

    如果将所有的代码都写到一个文件中,当对于小项目来说不会有什么问题,但是当它一个很大的工程的时候,如果将所有代码都写到一个文件中,不但开发起来很困难,维护更是头疼,所以我们应该将代码按不同的功能分别建立 ...

  3. 58同城高性能移动Push推送平台架构演进之路

    本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问 ...

  4. Castle ActiveRecord相关错误

    1.Could not compile the mapping document: (string)错误? 如果确保配置文件没有错误,那请检查用户身份,必须是Administrator才行,即使有管理 ...

  5. Java总结篇系列:类型转换/造型

    Java中,经常可以遇到类型转换的场景,从变量的定义到复制.数值变量的计算到方法的参数传递.基类与派生类间的造型等,随处可见类型转换的身影.Java中的类型转换在Java编码中具有重要的作用.首先,来 ...

  6. html初始化页面和a标签无下划线

    body, div, p, h1, h2, h3, h4, h5, h6, ul, ol, li, dl, dd, dt, img, form { padding:0px; margin:0px; b ...

  7. 基于类型系统的面向对象编程语言Go

    (整理自网络) 面向对象编程 Go语言的面向对象编程(OOP)非常简洁而优雅.说它简洁,在于它没有了OOP中很多概念,比如:继承.虚函数.构造函数和析构函数.隐藏的this指针等等.说它优雅,是它的面 ...

  8. web.xml中openEntityManagerInViewFilter的作用(转)

    <filter> <filter-name>openEntityManagerInViewFilter</filter-name> <filter-class ...

  9. 项目总结笔记系列 wsTax KT Session1

     项目总结笔记 1.专有名词解释: SMO, Separate Management Office. UAT, User Accept Test. GSLB, Global Server Load B ...

  10. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...