zoukankan      html  css  js  c++  java
  • [控件] 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

    设计细节

  • 相关阅读:
    Mac Terminal菜鸟篇之使用unrar解压rar文件
    Android开发之帐户管理
    Android API之android.view.View.MeasureSpec
    Android API之onLayout, onMeasure
    Android API之android.os.AsyncTask
    Android开发之Shortcuts, LiveFolder, Widget
    Android开发之短信
    Android系统示例分析之AndroidBeamDemo
    Android开发之定位系统
    Android系统示例之ActionBarCompat
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4470433.html
Copyright © 2011-2022 走看看