• IOS开发-UIImageView帧动画-UIImage的加载方式-汤姆猫实例


    一.概述

    本文介绍三个主题:

    1. UIImageview序列帧动画,序列帧动画就是将一组图片在特定的时间内一帧帧的播放.

    2. 序列帧动画使用实例汤姆猫程序

    3.UIImage的2种加载方式

    4.Xcode文档注释的作用(最后)

    二. UIImageView的帧动画

    1. 相关属性解析: 

      1)  animationImages:要显示的图片(一个装着UIImage的NSArray) .

    // 需要播放的序列帧图片数组(里面都是UIImage对象,会按顺序显示里面的图片)
    @property(nonatomic,copy) NSArray *animationImages; 

      2)   animationDuration:完整地显示一次animationImages中的所有图片所需的时间 .

    // 帧动画的持续时间
    @property(nonatomic) NSTimeInterval animationDuration;

      3)  animationRepeatCount:动画的执行次数(默认为0,代表无限循环) 

    // 帧动画的执行次数(默认是无限循环)
    @property(nonatomic) NSInteger animationRepeatCount;

    2. 相关方法解析: 

     1) 开始动画

    - (void)startAnimating; 

    2)  停止动画 

     - (void)stopAnimating;  

    3)判断对象是否正在运行动画,返回值BOOL型

     - (BOOL)isAnimating; 
    二. UIImage的2种加载方式
    方式一:有缓存(图片所占用的内存会一直停留在程序中,通过imageNamed方法传入图片名加载。
    // + (UIImage *)imageNamed:(NSString *)name; //name是图片的文件名
    // 使用实例
    UIImage *image = [UIImage imageNamed:filename];
    方式二:无缓存(图片所占用的内存会在一些特定操作后被清除),传入图片的全路径
    /**
     * + (UIImage *)imageWithContentsOfFile:(NSString *)path
     * - (id)initWithContentsOfFile:(NSString *)path;
     *  path是图片的全路径
    */
    使用实例:
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *path = [bundle pathForResource:filename ofType:nil];
    UIImage *image = [UIImage imageWithContentsOfFile:path];

    三. 汤姆猫的实例

    本实例只做动画功能没有音频的处理,界面如下:

                                     

    功能描述:点击对应的按钮后,让汤姆猫展现对应的动画

    实现步骤:

    1.搭建界面

    2.监听按钮点击

    3.根据不同按钮播放不同动画

    实现要点:

    根据不同按钮播放不同动画,由于六个按钮,每个按钮都需要播放动画,故可以将播放动画的动作放到一个方法中,而在各自按钮的监听事件中传入相应动画的图片名和数量,再此设及到数据问题,没种动画的图片数不一样,故可以将动画名和图片数量放入字典中。

    代码如下:

    #import "ViewController.h"
    
    @interface ViewController ()
    
    /** 字典对应每种动画的图片数量 让控制器拥有数据并使用懒加载方式加载数据 strong  */
    @property (nonatomic,strong)NSDictionary *dict;
    
    /** tom猫图片显示 */
    @property (weak, nonatomic) IBOutlet UIImageView *tom;
    
    /** 监听按钮点击 通过tag或者titile区分 */
    - (IBAction)btnClick:(UIButton *)sender;
    
    @end
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    /** 重写dict的get方法实现懒加载 */
    -(NSDictionary *)dict
    {
        if (_dict == nil)
        {
            // 得到字典
            NSLog(@"懒加载");
            NSBundle *bundle = [NSBundle mainBundle];
            NSString *path =[bundle pathForResource:@"tom" ofType:@"plist"];
            _dict = [NSDictionary dictionaryWithContentsOfFile:path];
        }
        return _dict;
    }
    - (IBAction)btnClick:(UIButton *)sender
    {
        // 正在播放动画则退出
        if (_tom.isAnimating)
            return;
       // 界面有6个按钮监听方法都是一个,有两种方式区分按钮
       // 方式1:可以用tag区分不同的按钮
       /* NSInteger tag = sender.tag;
        switch (tag)
        {
            case 1: //fart
                NSLog(@"fart");
                [self playAnimalWithImageName:@"fart" count:28];
                break;
            case 2: //cymbal
                NSLog(@"cymbal");
                [self playAnimalWithImageName:@"cymbal" count:13];
                break;
            case 3: //milk
                [self playAnimalWithImageName:@"drink" count:81];
                break;
            case 4: //bird
                [self playAnimalWithImageName:@"eat" count:40];
                break;
            case 5: //pie
                [self playAnimalWithImageName:@"pie" count:24];
                break;
            case 6: //pawn
                [self playAnimalWithImageName:@"scratch" count:56];
                break;
                
            default:
                break;
        }*/
        
        /** 方式二 通过button的字体属性:设置每个BTn的titel并将设为透明 这样做在屏幕上就不可见了 */
        
        // 根据title判断哪个按钮
        NSString *title = [sender titleForState:UIControlStateNormal];
        // 从字典中获取count
        int count = [self.dict[title] intValue];
        // 播放动画
        [self playAnimalWithImageName:title count:count];
        
    }
    -(void)playAnimalWithImageName:(NSString *)name count:(int)count
    {
        // 创建可变数组
        NSMutableArray *images = [NSMutableArray array];
        
        // 存储图片
        for (int i = 0; i < count; i++)
        {
            NSString *imageName = [NSString stringWithFormat:@"%@_%02d.jpg",name,i];
            
            // UIimage imagenamed使用完的图片存在缓存中 当程序需要使用大量图片时谨慎操作
            //UIImage *img = [UIImage imageNamed:imageName];
            
            //没有缓存方式加载
            NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:nil];
            
            UIImage *img = [[UIImage alloc] initWithContentsOfFile:path];
            [images addObject:img];
        }
        // 设置动画图片
        _tom.animationImages = images;
       
        // 设置时间
        _tom.animationDuration = 0.1 * count;
        // 播放次数
        _tom.animationRepeatCount = 1;
        
        // 停止播放
        [_tom startAnimating];
    }
    @end

    小结:

    1. 重复代码的封装抽取:

    当一份代码重复出现在程序的多处地方,就会造成程序又臭又长,当这份代码的结构要修改时,每一处出现这份代码的地方都得修改,导致程序的扩展性很差
    因此,要将重复出现的代码抽取到某个方法中,在需要这份代码的地方调用方法即可,如本例中的播放动画的代码
    2. 抽取代码的思路
    1)将相同的代码放到一个方法中
    2)将不同的值当做方法参数传进来如本例中的count,name

    3 . Xcode文档注释的作用(最后)

    格式:/** */

    文档注释(两个星)的作用,可以知道这个属性或方法的作用如下图:

    1)添加属性的文档注释

    2)添加方法的文档注释

    使用方法是会弹出提示:

  • 相关阅读:
    Web service是什么?
    SQL截取字符串
    SQL Server中使用索引性能的比较
    一个C#中webservice的初级例子(一)
    short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确。为何?
    SQL索引
    ORDER BY 子句在子查询和公用表表达式中无效的一种解决办法使用表变量
    创建 索引,
    时间的重叠
    SQLServer Datetime数据类型的转换
  • 原文地址:https://www.cnblogs.com/jianghg/p/4482794.html
Copyright © 2020-2023  润新知