iOS中刮刮乐功能的实现

作者: voQuan | 来源:发表于2017-10-24 16:07 被阅读175次

目前很多项目中都会用到“刮刮乐”这个功能点,处于此整理出了一套比较easy的实现方法。

在这里我主要用到了ImageMaskView这个类,下面来说说具体操作:

将项目中的Tools工具直接拖入到工程,ImageMaskView类作为VC的一个属性并遵循ImageMaskFilledDelegate的代理方法:

@interface ViewController ()<ImageMaskFilledDelegate>
@property(nonatomic, strong)ImageMaskView *baseImage;

图片的有两层,第一层为上面的覆盖层_baseImage,第二层为刮刮乐刮开后显示的图片层beforeImage:

UIImageView *beforeImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
beforeImage.frame = CGRectMake(10, 60, self.view.frame.size.width-20, 100);
beforeImage.center = self.view.center;
[self.view addSubview:beforeImage];

beforeImage.layer.borderColor = [UIColor grayColor].CGColor;
beforeImage.layer.borderWidth = 1;


//创建ImageMaskView
_baseImage = [[ImageMaskView alloc] initWithImage:[UIImage imageNamed:@"base"]];
_baseImage.alpha = 1.0;
_baseImage.frame = CGRectMake(10, 60, self.view.frame.size.width-20, 100);
_baseImage.center = self.view.center;
[self.view addSubview:_baseImage];

实现基本UI后,设置画笔半径radius大小:

//设置画笔的半径
  _baseImage.radius = 10;

调用ImageMaskView的beginInteraction方法:

// Initialization code
self.userInteractionEnabled = YES;
self.backgroundColor = [UIColor clearColor];
self.imageMaskFilledDelegate = self.imageMaskFilledDelegate ? self.imageMaskFilledDelegate : nil;
self.radius = self.radius > 0 ? self.radius : 20;

// Initalize bitmap context
CGSize size = self.image.size;
self.colorSpace = CGColorSpaceCreateDeviceRGB();
self.imageContext = CGBitmapContextCreate(0,size.width,
                                          size.height,
                                          8,
                                          size.width*4,
                                          colorSpace,
                                          kCGImageAlphaPremultipliedLast    );
CGContextDrawImage(self.imageContext, CGRectMake(0, 0, size.width, size.height), self.image.CGImage);

int blendMode = kCGBlendModeClear;
CGContextSetBlendMode(self.imageContext, (CGBlendMode) blendMode);

tilesX = size.width / (2 * self.radius);
tilesY = size.height / (2 * self.radius);

self.maskedMatrix = [[Matrix alloc] initWithMax:MySizeMake(tilesX, tilesY)];
self.tilesFilled = 0;

最重要的是要要设置代理:

_baseImage.imageMaskFilledDelegate = self;

实现代理方法:

#pragma mark ImageMaskFilledDelegate
- (void) imageMaskView:(ImageMaskView *)maskView clearPercentDidChanged:(float)clearPercent{
if (clearPercent > 50) {
    [UIView animateWithDuration:2
                     animations:^{
                         _baseImage.userInteractionEnabled = NO;
                         _baseImage.alpha = 0;
                         _baseImage.imageMaskFilledDelegate = nil;
                     }
                     completion:^(BOOL finished) {
                     }];
  }
}

效果图:

刮开前 刮开中

GIF图片:


刮刮乐.gif

需要源码的,点击这里

相关文章

  • iOS中刮刮乐功能的实现

    目前很多项目中都会用到“刮刮乐”这个功能点,处于此整理出了一套比较easy的实现方法。 在这里我主要用到了Imag...

  • iOS刮刮乐实现

    前言 突然看到支付宝的刮刮卡功能,闲来无事,写了一个小demo。 步骤及思路 UI布局; 获取触摸位置在图片上的坐...

  • iOS “刮刮乐”的简单实现

    这两天闲来无事,做一个“刮刮乐”的小功能给大家乐一乐。哈哈哈,先来看看效果图: 这个女朋友奖很简单就可以实现:1....

  • iOS开发 刮刮乐效果的实现

    引言 我们平时在使用支付宝的时候, 会看到类似彩票刮刮乐的效果。如何实现的呢?下面就直接上代码了... 刮刮乐效果...

  • iOS实现刮刮乐功能与图片添加水印功能

    代码简单直接上代码1.创建子视图 2.实现刮刮乐效果 3.图片添加文字水印 4.图片添加图片水印

  • 刮刮乐

  • 刮刮乐

    2007年3月3日,特别的日子。 为啥特别? 第一次坐飞机,青岛飞西安,提前4个小时就到机场了,在网上研究过攻略,...

  • 刮刮乐

    2014年11月3日 刮刮乐 今天杏子又在济南火车站候车了,这次她是故地重游,明显轻松了许多。 ...

  • 刮刮乐

    设置刮开后,显示的文字Label UILabel *label = [[UILabel alloc]initWit...

  • 刮刮乐

    刮刮乐这个东西真的是越刮越快乐,尤其是他给我准备的30张,现在有些喜欢30这个数字了,哈哈哈哈哈! 他给我准备...

网友评论

    本文标题:iOS中刮刮乐功能的实现

    本文链接:https://www.haomeiwen.com/subject/nzxxpxtx.html