• 图片碎片化mask动画


    图片碎片化mask动画

    效果

    源码

    https://github.com/YouXianMing/Animations

    //
    //  TransformFadeViewController.m
    //  Animations
    //
    //  Created by YouXianMing on 15/11/17.
    //  Copyright © 2015年 YouXianMing. All rights reserved.
    //
    
    #import "TransformFadeViewController.h"
    #import "TranformFadeView.h"
    #import "GCD.h"
    
    typedef enum : NSUInteger {
        
        TYPE_ONE,
        TYPE_TWO,
        
    } EType;
    
    @interface TransformFadeViewController ()
    
    @property (nonatomic, strong) TranformFadeView *tranformFadeViewOne;
    @property (nonatomic, strong) TranformFadeView *tranformFadeViewTwo;
    
    @property (nonatomic, strong) GCDTimer *timer;
    @property (nonatomic)         EType     type;
    
    @property (nonatomic, strong) NSArray   *images;
    @property (nonatomic)         NSInteger  count;
    
    @end
    
    @implementation TransformFadeViewController
    
    - (void)viewDidLoad {
        
        [super viewDidLoad];
    }
    
    - (void)setup {
    
        [super setup];
        
        self.images = @[[UIImage imageNamed:@"1"],
                        [UIImage imageNamed:@"2"],
                        [UIImage imageNamed:@"3"],
                        [UIImage imageNamed:@"4"],
                        [UIImage imageNamed:@"5"]];
        
        // 图片1
        self.tranformFadeViewOne                 = [[TranformFadeView alloc] initWithFrame:self.view.bounds];
        self.tranformFadeViewOne.contentMode     = UIViewContentModeScaleAspectFill;
        self.tranformFadeViewOne.image           = [self currentImage];
        self.tranformFadeViewOne.verticalCount   = 2;
        self.tranformFadeViewOne.horizontalCount = 12;
        self.tranformFadeViewOne.center          = self.view.center;
        [self.tranformFadeViewOne buildMaskView];
        
        self.tranformFadeViewOne.fadeDuradtion        = 1.f;
        self.tranformFadeViewOne.animationGapDuration = 0.1f;
        
        [self.view addSubview:self.tranformFadeViewOne];
        
        
        // 图片2
        self.tranformFadeViewTwo                 = [[TranformFadeView alloc] initWithFrame:self.view.bounds];
        self.tranformFadeViewTwo.contentMode     = UIViewContentModeScaleAspectFill;
        self.tranformFadeViewTwo.verticalCount   = 2;
        self.tranformFadeViewTwo.horizontalCount = 12;
        self.tranformFadeViewTwo.center          = self.view.center;
        [self.tranformFadeViewTwo buildMaskView];
        
        self.tranformFadeViewTwo.fadeDuradtion        = 1.f;
        self.tranformFadeViewTwo.animationGapDuration = 0.1f;
        
        [self.view addSubview:self.tranformFadeViewTwo];
        [self.tranformFadeViewTwo fadeAnimated:YES];
    
        // timer
        self.timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
        [self.timer event:^{
            
            if (self.type == TYPE_ONE) {
                
                self.type = TYPE_TWO;
                
                [self.view sendSubviewToBack:self.tranformFadeViewTwo];
                self.tranformFadeViewTwo.image = [self currentImage];
                [self.tranformFadeViewTwo showAnimated:NO];
                [self.tranformFadeViewOne fadeAnimated:YES];
                
            } else {
                
                self.type = TYPE_ONE;
                
                [self.view sendSubviewToBack:self.tranformFadeViewOne];
                self.tranformFadeViewOne.image = [self currentImage];
                [self.tranformFadeViewOne showAnimated:NO];
                [self.tranformFadeViewTwo fadeAnimated:YES];
            }
            
        } timeIntervalWithSecs:6];
        [self.timer start];
    }
    
    - (UIImage *)currentImage {
    
        self.count = ++self.count % self.images.count;
        
        return self.images[self.count];
    }
    
    @end
    //
    //  TranformFadeView.h
    //  TransformationFadeView
    //
    //  Created by XianMingYou on 15/4/16.
    //  Copyright (c) 2015年 XianMingYou. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface TranformFadeView : UIView
    
    /**
     *  Image显示方式
     */
    @property (nonatomic) UIViewContentMode  contentMode;
    
    /**
     *  要显示的相片
     */
    @property (nonatomic, strong) UIImage   *image;
    
    /**
     *  垂直方向方块的个数
     */
    @property (nonatomic) NSInteger          verticalCount;
    
    /**
     *  水平的个数
     */
    @property (nonatomic) NSInteger          horizontalCount;
    
    /**
     *  开始构造出作为mask用的view
     */
    - (void)buildMaskView;
    
    /**
     *  渐变动画的时间
     */
    @property (nonatomic) NSTimeInterval     fadeDuradtion;
    
    /**
     *  两个动画之间的时间间隔
     */
    @property (nonatomic) NSTimeInterval     animationGapDuration;
    
    /**
     *  开始隐藏动画
     *
     *  @param animated 是否执行动画
     */
    - (void)fadeAnimated:(BOOL)animated;
    
    /**
     *  开始显示动画
     *
     *  @param animated 时候执行动画
     */
    - (void)showAnimated:(BOOL)animated;
    
    @end
    //
    //  TranformFadeView.m
    //  TransformationFadeView
    //
    //  Created by XianMingYou on 15/4/16.
    //  Copyright (c) 2015年 XianMingYou. All rights reserved.
    //
    
    #import "TranformFadeView.h"
    
    #define  STATR_TAG  0x19871220
    
    @interface TranformFadeView ()
    
    /**
     *  图片
     */
    @property (nonatomic, strong) UIImageView    *imageView;
    
    /**
     *  所有的maskView
     */
    @property (nonatomic, strong) UIView         *allMaskView;
    
    /**
     *  maskView的个数
     */
    @property (nonatomic)         NSInteger       maskViewCount;
    
    /**
     *  存储maskView的编号
     */
    @property (nonatomic, strong) NSMutableArray *countArray;
    
    @end
    
    @implementation TranformFadeView
    
    /**
     *  初始化并添加图片
     *
     *  @param frame frame值
     */
    - (void)initImageViewWithFrame:(CGRect)frame {
        
        self.imageView                     = [[UIImageView alloc] initWithFrame:frame];
        self.imageView.layer.masksToBounds = YES;
        [self addSubview:self.imageView];
    }
    
    - (instancetype)initWithFrame:(CGRect)frame {
        
        if (self = [super initWithFrame:frame]) {
            
            [self initImageViewWithFrame:self.bounds];
        }
        
        return self;
    }
    
    - (void)buildMaskView {
        
        // 如果没有,就返回空
        if (self.horizontalCount < 1 || self.verticalCount < 1) {
            
            return;
        }
        
        // 承载所有的maskView
        self.allMaskView = [[UIView alloc] initWithFrame:self.bounds];
        self.maskView    = self.allMaskView;
        
        // 计算出每个view的尺寸
        CGFloat height         = self.frame.size.height;
        CGFloat width          = self.frame.size.width;
        CGFloat maskViewHeight = self.verticalCount   <= 1 ? height : (height / self.verticalCount);
        CGFloat maskViewWidth  = self.horizontalCount <= 1 ? width  : (width  / self.horizontalCount);
        
        // 用以计数
        int count = 0;
        
        // 先水平循环,再垂直循环
        for (int horizontal = 0; horizontal < self.horizontalCount; horizontal++) {
            
            for (int vertical = 0; vertical < self.verticalCount; vertical++) {
            
                CGRect frame = CGRectMake(maskViewWidth  * horizontal,
                                          maskViewHeight * vertical,
                                          maskViewWidth,
                                          maskViewHeight);
                
                UIView *maskView         = [[UIView alloc] initWithFrame:frame];
                maskView.frame           = frame;
                maskView.tag             = STATR_TAG + count;
                maskView.backgroundColor = [UIColor blackColor];
                
                [self.allMaskView addSubview:maskView];
                
                count++;
            }
        }
        
        self.maskViewCount = count;
        
        // 存储
        self.countArray  = [NSMutableArray array];
        for (int i = 0; i < self.maskViewCount; i++) {
            
            [self.countArray addObject:@(i)];
        }
    }
    
    /**
     *  策略模式一
     *
     *  @param inputNumber 输入
     *
     *  @return 输出
     */
    - (NSInteger)strategyNormal:(NSInteger)inputNumber {
        
        NSNumber *number = self.countArray[inputNumber];
        return number.integerValue;
    }
    
    - (void)fadeAnimated:(BOOL)animated {
        
        if (animated == YES) {
            
            for (int i = 0; i < self.maskViewCount; i++) {
                
                UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]];
                [UIView animateWithDuration:(self.fadeDuradtion <= 0.f ? 1.f : self.fadeDuradtion)
                                      delay:i * (self.animationGapDuration <= 0.f ? 0.2f : self.animationGapDuration)
                                    options:UIViewAnimationOptionCurveLinear
                                 animations:^{
                                     
                                     tmpView.alpha = 0.f;
                                     
                                 } completion:^(BOOL finished) {
                                     
                                 }];
            }
            
        } else {
            
            for (int i = 0; i < self.maskViewCount; i++) {
                
                UIView *tmpView = [self maskViewWithTag:i];
                tmpView.alpha   = 0.f;
            }
        }
    }
    
    - (void)showAnimated:(BOOL)animated {
        
        if (animated == YES) {
            
            for (int i = 0; i < self.maskViewCount; i++) {
                
                UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]];
                
                [UIView animateWithDuration:(self.fadeDuradtion <= 0.f ? 1.f : self.fadeDuradtion)
                                      delay:i * (self.animationGapDuration <= 0.f ? 0.2f : self.animationGapDuration)
                                    options:UIViewAnimationOptionCurveLinear
                                 animations:^{
                                     
                                     tmpView.alpha = 1.f;
                                 } completion:^(BOOL finished) {
                                     
                                 }];
            }
            
        } else {
            
            for (int i = 0; i < self.maskViewCount; i++) {
                
                UIView *tmpView = [self maskViewWithTag:i];
                tmpView.alpha   = 1.f;
            }
        }
    }
    
    /**
     *  根据tag值获取maskView
     *
     *  @param tag maskView的tag值
     *
     *  @return tag值对应的maskView
     */
    - (UIView *)maskViewWithTag:(NSInteger)tag {
        
        return [self.maskView viewWithTag:tag + STATR_TAG];
    }
    
    #pragma mark - setter & getter.
    @synthesize contentMode = _contentMode;
    - (void)setContentMode:(UIViewContentMode)contentMode {
        
        _contentMode               = contentMode;
        self.imageView.contentMode = contentMode;
    }
    
    - (UIViewContentMode)contentMode {
        
        return _contentMode;
    }
    
    @synthesize image = _image;
    - (void)setImage:(UIImage *)image {
        
        _image               = image;
        self.imageView.image = image;
    }
    
    - (UIImage *)image {
        
        return _image;
    }
    
    @end

    细节

    使用的时候动态切换图片就可以了,实际上只需要创建出2个view.

  • 相关阅读:
    AAC-LC 是什么格式?和 AAC 有什么区别?
    AAC_LC用LATM封装header信息解析 Audio Specific Config格式分析
    AAC的AudioSpecificConfig细节
    AAC帧格式及编码介绍
    AAC 格式分析
    AAC头部格式,RTP打包格式
    RTP 打包H264与AAC
    程序员除了会CRUD之外,还应该知道什么叫CQRS!
    Neo4j数据库学习一:安装和数据类型常用命令简介
    【Neo4j查询优化系列】如何快速统计节点的关系数
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4972445.html
Copyright © 2020-2023  润新知