美文网首页iOS开发iOS 收集
图片动画(animationImage)

图片动画(animationImage)

作者: 嘻嘻zhy | 来源:发表于2015-12-02 17:02 被阅读1828次

    准备

    首先创建一个imageView,无论是在storyboard上面创建还是用代码创建。
    这次试验中在是在storyboard上面创建,并将imageView与ViewController关联。


    并且将准备好的图片放入Assert.xcasserts中。



    方式一

    创建一个UIImage对象。

    - (void)viewDidLoad {
        [super viewDidLoad];
        UIImage *image=[UIImage animatedImageNamed:@"动画" duration:3 ];
        self.animatedImageView1.image =image;
       }
    

    使用+ (nullable UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)方法需要的name的字符串只需要base name就可以了,不需要添加123456789等数字。

    运行后,动画成功实现。

    问题一:怎么让动画停止?
    动画开始之后,不会自动停下来,怎么让它停止?

    可以这么处理,设定一个延迟时间,时间一到调用方法,将image的值重新赋值。

    - (void)viewDidLoad {
        [super viewDidLoad];
        UIImage *image=[UIImage animatedImageNamed:@"动画" duration:3 ];
        self.animatedImageView1.image =image;
        [self performSelector:@selector(stopImage) withObject:nil afterDelay:3];
    }
    
    -(void)stopImage{
        self.animatedImageView1.image =[UIImage imageNamed:@"动画18"];
        
    }
    

    这样做好像确实成功了,但是本来UIImageView官方给了动画图片的属性----animationImages,我这里只用了image属性,,感觉有点怪怪的。
    那么我们就用UIImageView给的Animating Images API文档来实现。

    方式二

    首先animationImages是一个 NSArray < UIImage *> 的图片类型的数组。
    所以要将动画图片放入NSArray中。
    animationDuration指动画周期,如设定为3,周期则是3秒。
    animationRepeatCount指循环次数。
    还有startAnimating以及stopAnimating方法,分别是动画开始与动画停止。

    代码如下

    - (void)viewDidLoad {
        [super viewDidLoad];
        //创建数组
        NSArray<UIImage*> *imageArray=[NSArray arrayWithObjects:
                                       [UIImage imageNamed:@"动画1"],
                                       [UIImage imageNamed:@"动画2"],
                                       [UIImage imageNamed:@"动画3"],
                                       [UIImage imageNamed:@"动画4"],
                                       [UIImage imageNamed:@"动画5"],
                                       [UIImage imageNamed:@"动画6"],
                                       [UIImage imageNamed:@"动画7"],
                                       [UIImage imageNamed:@"动画8"],
                                       [UIImage imageNamed:@"动画9"],
                                       [UIImage imageNamed:@"动画10"],
                                       [UIImage imageNamed:@"动画11"],nil];
        //赋值
        self.animatedImageView1.animationImages=imageArray;
        //周期时间
        self.animatedImageView1.animationDuration=3;
        //重复次数,0为无限制
        self.animatedImageView1.animationRepeatCount=1;
        //开始
        [self.animatedImageView1 startAnimating];
        [self performSelector:@selector(stopImage) withObject:nil afterDelay:3];
    }
    
    -(void)stopImage{
        [self.animatedImageView1 stopAnimating];
    }
    

    写完代码之后还是感觉很不对劲。
    1.如果动画图片有100张,那我要一张一张添加得要写多少行代码?
    2.动画结束之后什么图片都不显示了,UIImageView内容就只是空白一张,不美观也不符合逻辑。

    解答一###

    还记得一开始的 UIImage *image=[UIImage animatedImageNamed:@"动画" duration:3 ];么?
    UIImage对象有个images的属性,该属性是一个保存动画图像组成完成的队列也是NSArray< UIImage *>类型。
    这就意味着我们可以通过这个方法,直接得到UIImage里面的图片 。不需要再哪么拙计的往Array里面添加图片。
    大长段的代码即可直接改成这样。

        //创建数组
        UIImage *image=[UIImage animatedImageNamed:@"动画" duration:3];
        NSArray<UIImage*> *imageArray = [NSArray arrayWithArray:image.images];
    

    解答二###

    这里耍一个小技巧,用image去替代animationImage。
    我们可以先给image属性赋值,在startAnimating开始后,animationImage覆盖了image,而stopAnimating停止之后,animationImage就消失了,这时候image就取代了animationImage一开始的位置.

    Swift##

    Swift今天开源了,特意翻译一遍。

      @IBOutlet weak var animatedImageView1: UIImageView!
        override func viewDidLoad() {
            super.viewDidLoad()
            let image :UIImage = UIImage.animatedImageNamed("动画", duration: 3)!;
            
            let imageArray:NSArray = NSArray.init(array: image.images!);        //赋值
            self.animatedImageView1.animationImages=imageArray as? [UIImage];
            //周期时间
            self.animatedImageView1.animationDuration=3;
            //重复次数,0为无限制
            self.animatedImageView1.animationRepeatCount=0;
            //开始
            self.animatedImageView1.startAnimating();
            self.performSelector("stopImage", withObject: nil, afterDelay:10);
            
        }
        
        func stopImage(){
            self.animatedImageView1.stopAnimating();
        }
    

    相关文章

      网友评论

      • 阿斯兰iOS:解答二: iv.image = animatedImage.images.firstObject; // 动画结束或开始前显示的图片

      本文标题:图片动画(animationImage)

      本文链接:https://www.haomeiwen.com/subject/iotshttx.html