使用maskView设计动画效果

在 极客学院 简单学习了一下 如何使用maskView设计动画效果

主要是通过CAGradientLayer 或者 带有alpha的图片来操作

    //MARK:1. maskView(maskLayer)基本原理

    CGFloat width = 120.f;

    //底图
    self.baseImageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, width, width)];
    [_baseImageView setImage:[UIImage imageNamed:@"base"]];
    [self.view addSubview:_baseImageView];

    //mask 是有透明的
    self.maskImageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20 + width + 20, width, width)];
    [_maskImageView setImage:[UIImage imageNamed:@"mask"]];
    [self.view addSubview:_maskImageView];

    //使用maskView的情况
    self.addImageView  = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20 + (width + 20) * 2, width, width)];
    [_addImageView setImage:[UIImage imageNamed:@"base"]];
    UIImageView *mask  = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, width, width)];
    [mask setImage:[UIImage imageNamed:@"mask"]];

    [_addImageView setMaskView:mask];//iOS8.0之后才有 maskView不能用addSubView的方式来添加遮罩!!!

    /*iOS 8之前
//    CALayer *layer = [CALayer layer];
//    [layer setFrame:CGRectMake(0, 0, width, width)];
//    [layer setContents:(id)[UIImage imageNamed:@"mask"].CGImage];
//    [_addImageView.layer setMask:layer];
    */

    [self.view addSubview:_addImageView];

    //MARK:2. maskView配合CAGradientLayer的使用

    // 第一步 加载图片
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(width + 40, 20, 200, 200)];
    [imageView setImage:[UIImage imageNamed:@"base"]];
    [self.view addSubview:imageView];
    // 第二步 创建出CAGradientLayer
    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    [gradientLayer setFrame:imageView.bounds];//遮罩层的区域
    [gradientLayer setColors:@[(__bridge id)[UIColor clearColor].CGColor,
                               (__bridge id)[UIColor blackColor].CGColor,
                               (__bridge id)[UIColor clearColor].CGColor]];//渐变的颜色数组 __bridge id类型
    [gradientLayer setLocations:@[@(0.25),@(0.5),@(0.75)]];//渐变的区域 整个是1 0.25就是1/4处以此类推
    [gradientLayer setStartPoint:CGPointMake(0, 0)];
    [gradientLayer setEndPoint:CGPointMake(1, 0)];//渐变的方向(1,0)就是横向 (1,1)就是从左上角到右下角以此类推
    // 第三步 创建一个容器View 用于加载创建出的CAGradientLayer
    UIView *containerView = [[UIView alloc]initWithFrame:imageView.bounds];
    [containerView.layer addSublayer:gradientLayer];
    // 最后 设定maskView
    imageView.maskView = containerView;

    // 扩展 给maskView做动画 除了修改容器view的fram值之外 还可以动态的修改location startPoint endPoint等 实现很绚丽的动画效果
    CGRect frame        = containerView.frame;
    frame.origin.x     -= 200;//这里200是图片的宽 也就是让容器View的最右边和底层图片的最左边重合
    containerView.frame = frame;
    [UIView animateWithDuration:4.0f animations:^{
        CGRect frame    = containerView.frame;//改变位移
        frame.origin.x += 400;//从左移动到右边
        containerView.frame = frame;//重新赋值
    }];

    //MARK:3. maskView配合alpha通道图片的使用
    // 添加背景图
    UIImageView *backgroundView = [[UIImageView alloc]initWithFrame:CGRectMake(width + 40, 200 + 40, 200, 200)];
    [backgroundView setImage:[UIImage imageNamed:@"background"]];
    [self.view addSubview:backgroundView];

    // 待切换图
    UIImageView *baseView = [[UIImageView alloc]initWithFrame:backgroundView.frame];
    [baseView setImage:[UIImage imageNamed:@"base"]];
    [self.view addSubview:baseView];

    // 创建maskView作为容器
    UIView *maskView  = [[UIView alloc]initWithFrame:baseView.bounds];
    baseView.maskView = maskView;

    //maskView的subView1
    UIImageView *picOne = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 400)];//100背景宽一半,400背景高两倍 1的上半部是alpha为0
    [picOne setImage:[UIImage imageNamed:@"1"]];
    [maskView addSubview:picOne];

    //maskView的subView2
    UIImageView *picTwo = [[UIImageView alloc]initWithFrame:CGRectMake(100, -200, 100, 400)];//2的下半部alpha为0
    [picTwo setImage:[UIImage imageNamed:@"2"]];
    [maskView addSubview:picTwo];

    //做切换图片的动画
    [UIView animateWithDuration:2.0f animations:^{
        CGRect oneFrame    = picOne.frame;
        oneFrame.origin.y -= 400;
        picOne.frame       = oneFrame;

        CGRect twoFrame    = picTwo.frame;
        twoFrame.origin.y += 400;
        picTwo.frame       = twoFrame;
    }];

    //MARK:4. 设计文本横向渐变消失的控件
    [self.view setBackgroundColor:[UIColor grayColor]];

    // 创建FadeString
    FadeString *fadeString = [[FadeString alloc]initWithFrame:CGRectMake(0, 400+40, 300, 40)];
    [fadeString setCenter:CGPointMake(self.view.center.x, fadeString.center.y)];
    fadeString.text = @"这个效果看起来还是不错的";
    [self.view addSubview:fadeString];

    // 执行动画效果
    [fadeString fadeRight];

自定义的 FadeString.h

// 输入的文本
@property (nonatomic, strong) NSString *text;

// 向右渐变消失的方法
- (void)fadeRight;

FadeString.m

#import "FadeString.h"

@interface FadeString ()

@property (nonatomic, strong) UILabel *label; // 显示文字的label
@property (nonatomic, strong) UIView  *mask;  // 作为遮罩的mask

@end

@implementation FadeString
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 创建出label
        [self createLabel:self.bounds];
        // 创建出mask
        [self createMask:self.bounds];
    }
    return self;
}

- (void)createLabel:(CGRect)frame {
    self.label = [[UILabel alloc]initWithFrame:frame];
    [_label setFont:[UIFont systemFontOfSize:25.0f]];
    [_label setTextAlignment:NSTextAlignmentCenter];
    [_label setTextColor:[UIColor whiteColor]];

    [self addSubview:_label];
}
- (void)createMask:(CGRect)frame {
    //创建出渐变的layer
    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    [gradientLayer setFrame:frame];
    [gradientLayer setColors:@[(__bridge id)[UIColor clearColor].CGColor,
                               (__bridge id)[UIColor blackColor].CGColor,
                               (__bridge id)[UIColor blackColor].CGColor,
                               (__bridge id)[UIColor clearColor].CGColor]];
    [gradientLayer setLocations:@[@(0.01), @(0.1), @(0.9), @(0.99)]];
    [gradientLayer setStartPoint:CGPointMake(0, 0)];
    [gradientLayer setEndPoint:CGPointMake(1, 0)];

    // 创建并接管mask
    self.mask     = [[UIView alloc]initWithFrame:frame];
    // mask获取渐变layer
    [self.mask.layer addSublayer:gradientLayer];
    self.maskView = _mask;
}

- (void)fadeRight {
    //当前的设计是有缺陷的 最好加上两个参数 一个动画时间 一个是否执行动画

    [UIView animateWithDuration:3.f animations:^{
        CGRect maskFrame    = _mask.frame;
        maskFrame.origin.x += _mask.frame.size.width;
        _mask.frame         = maskFrame;
    }];
}

//MARK:重写set,get方法
@synthesize text = _text;
- (void)setText:(NSString *)text {
    _text           = text;
    self.label.text = text;
}
- (NSString *)text {
    return _text;
}
/*
 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect {
 // Drawing code
 }
 */

@end

极客学院的视频地址:http://www.jikexueyuan.com/course/1257.html

其中:

__bridge只做类型转换,但是不修改对象(内存)管理权;
      __bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;
      __bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。
    
      关于这方面的解释 https:developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

时间: 2024-11-07 22:43:15

使用maskView设计动画效果的相关文章

使用 maskView 设计动画

1.maskView(maskLayer) 基本原理 :可类比于多张png图片叠加遮罩 2.maskView配合CAGradientLayer,alpha通道图片的使用.maskView是iOS8以上才有,如果要考虑兼容低版本,用maskLayer替换 3.设计方本横向渐变消失的控件 一.两张png图片叠加遮罩 - (void)addMaskView { CGFloat width = 120; // 使用maskView的情况 UIImageView *addImageView= [[UIIm

设计能长按并有动画效果且能触发事件的高级view

效果图: 源码: LongTapAnimationView.h 与 LongTapAnimationView.m // // LongTapAnimationView.h // YouXianMingClock // // Created by YouXianMing on 14-10-13. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> @class LongTapAni

【Android UI设计与开发】10:滑动菜单栏(二)SlidingMenu 动画效果的实现

其实就是在显示菜单栏时,有个动画的效果.代码比较简单,下面进行说明. 1.效果图如下,手机上查看效果更佳 2.代码实现,这里只讲解动画效果的实现,具体代码可在源代码中查看 <1> 先定义一个CanvasTransformer接口对象,这个接口是在slidingmenu_library类库中封装好的 private CanvasTransformer mTransformer; <2> 然后再实例化此接口,重写接口中的方法,例如示例1中的方法: /** * transformCanv

网页设计中热门的css和js酷炫动画效果

最近在网站和博客上能发现使用各种各样很帮效果的动画效果.CodyHouse介绍了这些CSS和Javas cript的编码教程. 因为每个文件都可以整套下载,所以马上就可以使用. 固定背景效果 →效果页 适用的浏览器:Chrome,Safari,Firefox,Opera,IE9+ 在Section和div垂直配置的长页面中,把背景固定,像卷帘被提起似的滚动. 产品展示滑块 →效果页 适用的浏览器:Chrome,Safari,Firefox,Opera,IE9+ 把配置卡片状的各个产品,用很棒的动

CSS动画效果之animation

Y(^o^)Y css动画大乱弹之animation. 概述 什么是animation呢?在回答这个问题之前,先要说明什么叫做@keyframe(关键帧).@keyframe算是一个动画模板.在其中,可以使用百分比,如从0%到100%的任意值,分别在每个百分比中,加上不同的属性,从而让元素达到一种在不断变化的动画效果.这和我们制作flash动画一样,我们只需设计几个关键帧,系统就能生成动画啦! 一个@keyframe例子: 1 /*定义关键帧动画*/ 2 @keyframes myframe {

用HTML和CSS实现WWDC 2015上的动画效果

用HTML和CSS实现WWDC 2015上的动画效果 动画效果WWDC 2015 原文:https://cssanimation.rocks/wwdc15/ 译者:周晓楷(@Helkyle) 每年,苹果都会召开一次重大的会议.WWDC(苹果开发者大会)是iOS开发者和OSX开发者学习苹果先进高科技和移动设备与桌面软件新概念的好机会. 每一年的这个时候,他们都会制造出很多新创意,今年,我被一个用简单圆圈和形状制作出来的图标所惊艳,于是我决定用HTML和CSS来实现它. WWDC 15邀请卡 苹果的

仿知乎FloatingActionButton浮动按钮动画效果实现(一)

最近刚接触使用android studio,那酸爽简直停不下来23333,eclipse什么的以后可以放弃了~ 然后在默认生成的第一个项目发现了一个新的控件,即FloatingActionButton,联想到知乎上也有这个控件,于是模仿知乎的效果试一试. 大概分为四个步骤: Step1:修改原生FloatingActionButton的背景颜色和点击颜色. Step2:描绘FloatingActionButton的点击动画效果. Step3:设置蒙版模拟点击以后的界面雾化效果. Step4:设置

JS DOM编程艺术——用JS实现动画效果—— JS学习笔记2015-7-22(第89天)

实用的动画效果: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>实用的动画效果</title> <style> #slideshow{ width: 100px; height: 100px; position: rela

滑动菜单栏SlidingMenu动画效果的实现

经过上一篇文章的学习,相信大家对开源项目SlidingMenu的用法已经有了一个非常深入的了解,那么这一章博 主就来教大家滑动菜单栏滑动时动画效果的实现.博主这里用了三个不同动画效果的基础示例来教大家如何去实现, 等 大家 弄懂了之后完全可以做到举一反三,去实现更多不同的动画效果,让你的应用软件给用户带来眼前一亮的效 果. 一.SlidingMenu动画效果示例一 1.示例一效果图 该示例实现了滑动时缩放的效果,看左边的效果图可以明显的感觉到,滑动菜单栏刚刚打开时的图片比右边的效 果图 滑动菜单