[控件] LiveChangedImageView

LiveChangedImageView

 

效果

 

说明

切换图片的时候自动根据图片的尺寸进行渐变式切换,效果很不错,使用非常容易。

 

源码

https://github.com/YouXianMing/UI-Component-Collection

//
//  LiveChangedImageView.h
//  LiveImageView
//
//  Created by YouXianMing on 15/5/1.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface LiveChangedImageView : UIView

/**
 *  动画持续时间(默认值为0.3s)
 */
@property (nonatomic)          NSTimeInterval   duration;

/**
 *  原始的图片(只需要赋值一次,重写了setter方法,要注意)
 */
@property (nonatomic, strong)  UIImage         *image;

/**
 *  变化到的图片
 */
@property (nonatomic, strong)  UIImage         *changeToImage;

/**
 *  边框大小
 */
@property (nonatomic)          CGFloat          borderWidth;

/**
 *  边框颜色
 */
@property (nonatomic, strong)  UIColor         *borderColor;

/**
 *  变化时候的动画
 *
 *  @param animated 是否执行动画
 */
- (void)changedAnimation:(BOOL)animated;

/* ==========================
   ----- 简化操作的方法 -----
 ========================== */

/**
 *  便利构造器
 *
 *  @param frame    frame值
 *  @param duration 动画持续时间
 *  @param image    原始的图片
 *
 *  @return 实例对象
 */
+ (instancetype)liveChangedImageViewWithFrame:(CGRect)frame
                                     duration:(NSTimeInterval)duration
                                   startImage:(UIImage *)image;

/**
 *  切换到其他图片
 *
 *  @param image    被切换的图片
 *  @param animated 是否执行动画
 */
- (void)changeToImage:(UIImage *)image animated:(BOOL)animated;

@end
//
//  LiveChangedImageView.m
//  LiveImageView
//
//  Created by YouXianMing on 15/5/1.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "LiveChangedImageView.h"

@interface LiveChangedImageView ()

@property (nonatomic, strong) UIImageView  *imageView;

@end

@implementation LiveChangedImageView

/**
 *  创建出imageView
 *
 *  @param frame imageView的frame值
 */
- (void)createImageView:(CGRect)frame {

    self.imageView = [[UIImageView alloc] initWithFrame:frame];
    [self addSubview:self.imageView];

}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {

        [self createImageView:self.bounds];

        self.duration = 0.3f;

    }
    return self;
}

- (void)changedAnimation:(BOOL)animated {

    if (_changeToImage == nil) {
        return;
    }

    // 如果设定了动画
    if (animated) {

        // 设定切换动画
        CABasicAnimation *contentsAnimation = [CABasicAnimation animationWithKeyPath:@"contents"];
        contentsAnimation.duration          = _duration;
        contentsAnimation.fromValue         = (__bridge id)(_imageView.image.CGImage);
        contentsAnimation.toValue           = (__bridge id)(_changeToImage.CGImage);
        _imageView.layer.contents           = (__bridge id)(_changeToImage.CGImage);

        // 设定尺寸动画
        CGRect startRect = CGRectMake(0, 0, _imageView.image.size.width, _imageView.image.size.height);
        CGRect endRect   = CGRectMake(0, 0, _changeToImage.size.width, _changeToImage.size.height);

        CABasicAnimation *boundsAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"];
        boundsAnimation.duration          = _duration;
        boundsAnimation.fromValue         = [NSValue valueWithCGRect:startRect];
        boundsAnimation.toValue           = [NSValue valueWithCGRect:endRect];
        _imageView.layer.bounds           = endRect;

        // 动画组
        CAAnimationGroup *group = [CAAnimationGroup animation];
        group.duration          = _duration;
        group.animations        = @[contentsAnimation, boundsAnimation];
        group.delegate          = self;

        // 加载动画
        [_imageView.layer addAnimation:group forKey:nil];

    } else {

        _imageView.image  = _changeToImage;
        _imageView.bounds = CGRectMake(0, 0, _changeToImage.size.width, _changeToImage.size.height);

    }
}

#pragma mark - 动画代理
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    _imageView.image = _changeToImage;
}

+ (instancetype)liveChangedImageViewWithFrame:(CGRect)frame
                                     duration:(NSTimeInterval)duration
                                   startImage:(UIImage *)image {
    LiveChangedImageView *changedView = [[LiveChangedImageView alloc] initWithFrame:frame];
    changedView.image                 = image;
    changedView.duration              = duration;

    return changedView;
}

- (void)changeToImage:(UIImage *)image animated:(BOOL)animated {
    self.changeToImage = image;
    [self changedAnimation:animated];
}

#pragma mark - 重写setter,getter方法
@synthesize image = _image;
- (void)setImage:(UIImage *)image {
    _image            = image;
    _imageView.image  = image;
    _imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
}

- (UIImage *)image {
    return _imageView.image;
}

@synthesize borderColor = _borderColor;
- (void)setBorderColor:(UIColor *)borderColor {
    _imageView.layer.borderColor = borderColor.CGColor;
    _borderColor                 = borderColor;
}

- (UIColor *)borderColor {
    return _borderColor;
}

@synthesize borderWidth = _borderWidth;
- (void)setBorderWidth:(CGFloat)borderWidth {
    _imageView.layer.borderWidth = borderWidth;
    _borderWidth                 = borderWidth;
}

- (CGFloat)borderWidth {
    return _borderWidth;
}

@end

设计细节

时间: 2024-09-08 08:05:57

[控件] LiveChangedImageView的相关文章

C++ Builder中如何保持控件的位置及大小

C++ Builder/Delphi是Inprise(原Borland)公司广受欢迎的可视化C++/Pascal开发工具,利用它可极大地加快应用程序的开发速度.但是,也正因为其是可视化编程工具,将控件拖放到Form后,控件的位置就固定死了.随着Form的大小或屏幕分辨率的改变,控件和Form本身的位置往往变得非常混乱.本文将介绍一些正确定位控件及Form的方法. 利用OnResize事件改变控件位置及大小 C++ Builder/Delphi中的Form控件有一个OnResize事件,Form的

javaweb-网页调用ocx控件打开或创建注册表的权限问题

问题描述 网页调用ocx控件打开或创建注册表的权限问题 在某几个win7 64位笔记本上, 通过服务器页面调用ocx读取注册表会提示无权限的现象,但使用本地html文件调用没问题, 不知是何原因,求大侠给点提示 解决方案 又试了一下,使用世界之窗浏览器可以正常使用了.但不明白为何? 解决方案二: ie本地file协议浏览(intranet)和http访问(internet)使用的是不同的安全设置,你按照本地的intranet安全配置internet安全设置 不过你这种需求没什么意义,只能针对特殊

web-关于不用控件绑定数据的问题

问题描述 关于不用控件绑定数据的问题 各位大神 我是一名在校计算机系大学生 想请教一下现在企业里做web是不是不用vs里面自带的控件 如果不用控件 这个gridview绑定数据库的数据应该如何实现 能说详细点或者给个链接教程吗 先不说 mvc架构 我想先用代码去实现 再去学mvc 谢谢 求大神指点 解决方案 很难的 怎么有点看不到是什么啊 解决方案二: 对WEB来说.其实很简单.WEB中表格的本质是 <table><tr><td></td></tr&g

控件-mscomm串口波形绘制范例,求大神解析这三个函数,急急急,绘制波形图的原理是什么,拜托了

问题描述 mscomm串口波形绘制范例,求大神解析这三个函数,急急急,绘制波形图的原理是什么,拜托了 //串口void CPort_testDlg::OnComm() { //if(stop)return; VARIANT m_input1; COleSafeArray m_input2; long lengthi; BYTE data[600]; CString str; int ai=0bi=0ci=0di=0; int sum=0; if(m_Comm.GetCommEvent()==2)

Javascript 遍历页面text控件详解

 本篇文章主要是对Javascript遍历页面text控件进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 以下函数实现了列出页面中所有html控件类型为text的控件ID    代码如下:         function Texts()          {               //var els= document.getElementsByTagName("*");   //els得到页面所有控件               var els= document.

充分利用 .NET 框架的 PropertyGrid 控件(微软)之二

控件|微软 创建 PropertyGrid 控件要使用 Visual Studio .NET 创建 PropertyGrid 控件,需要将该控件添加到工具箱中,因为默认情况下并不包含该控件.在 Tools(工具)菜单中,选择 Customize Toolbox(自定义工具箱).在对话框中选择 Framework Components(框架组件)选项卡,然后选择 PropertyGrid. 如果您从命令行编译代码,请使用 /reference 选项并指定 System.Windows.Forms.

如何用c#来制作一个activeX控件或类似的东西

active|activex|控件 Q cat: 操作系统: 2000/xp 编程工具: vs.net 2003 /c# 问题: 我想制作一个activeX控件或类似的东西,有用户界面的,然后想在ie中使用,通过Vbscript与其进行数据交换,在以前好像可以使用vb就能做到,但是现在是vs.net 2003企业版,好像已经进化了,activeX成了老的技术,那vs.net如何解决这种类似的问题?如果要使用c#来编程的话,具体如何操作?还要有界面. A回答: 在C#中和ActiveX控件对应的是

手机端产品交互设计:手机端产品翻页控件的设计

文章描述:对手机端产品翻页控件做的一些粗浅整理归纳.具体到设计应用中,我们需要根据产品性质.用户操作使用情景.手机和操作平台本身的特性等具体情况来考虑设计使用翻页控件. 翻页控件在很多手机端产品中属于容易被忽视但又不可或缺的一部分,今天就手机端产品翻页控件的分类和使用谈谈自己一些粗浅的看法. 在手机端产品中,翻页控件的展示形式五花八门:以所展示信息内容的性质和用户的使用情境作为维度划分的话,大致可以分为这样几个类型: A:时效类翻页控件 产品所展示的信息在"时效性""关联度&

iOS8新特性扩展(Extension)应用之四——自定义键盘控件

iOS8新特性扩展(Extension)应用之四--自定义键盘控件         iOS8系统的开放第三方键盘,使得用户在输入法的选择上更加自主灵活,也更加贴近不同语言的输入风格.这篇博客,将介绍如何开发一个第三方的键盘控件. 一.了解UIInputViewController类         UIInputViewController是系统扩展支持键盘扩展的一个类,通过这个类,我们可以自定义一款我们自己的键盘提供给系统使用.         首先,我们先来看一下这个类中的一些属性和方法: