zoukankan      html  css  js  c++  java
  • [控件] TranformFadeView

    TranformFadeView

    效果图:

    源码地址:

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

    注意:

    maskView是iOS8中新出的,用以简化alpha遮罩的操作,与layer的mask是一回事,想要修改兼容的,请考虑使用layer的mask来满足你的需求.

    特点:

    * 方块的个数可以自己设定

    * 你可以实现你自己的策略来设定渐变消失的方式

    核心源码:

    //
    //  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];
    }
    
    /* 重写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

    需要注意的细节:

  • 相关阅读:
    HDU3145 Max Sum of Max-K-sub-sequence (单调队列模板)
    AcWing1088 旅行问题(单调队列)
    POJ1821 Fence(单调队列)
    POJ1742 Coins(多重背包+二进制优化)
    AcWing217 绿豆蛙的归宿(期望)
    BZOJ.2134.[国家集训队]单选错位(概率 递推)
    洛谷.3805.[模板]manacher算法
    Codeforces.280C.Game on Tree(期望)
    BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)
    洛谷.4172.[WC2006]水管局长(LCT Kruskal)
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4432204.html
Copyright © 2011-2022 走看看