前言

这是一个简单却功能强大的刮刮乐视图,几行代码就可以实现刮刮乐效果,而且性能良好。下面有美女福利哟,相信我,你会喜欢的

相信大家都买过彩票刮刮乐,总是会抱着中大奖的情况去刮,希望自己是最幸运的那一个,刮中五百万,抱得美人归,从此走上人生巅峰。但现实往往是你口袋里面的几十块零钱,几分钟就被消费殆尽了

许多APP也集成了这一功能,比如用支付宝线下支付后就有刮刮乐。虽然刮中的都是些没多大用的优惠券,但总是会吸引人去刮一刮,万一中了大奖呢

实现效果

多说无益,先来看看实现的效果吧

彩票刮刮乐

调研

在网上搜索了一番,方案基本上就是这种:链接。

核心代码:

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {// 触摸任意位置UITouch *touch = touches.anyObject;// 触摸位置在图片上的坐标CGPoint cententPoint = [touch locationInView:self.imageView];// 设置清除点的大小CGRect  rect = CGRectMake(cententPoint.x, cententPoint.y, 20, 20);// 默认是去创建一个透明的视图UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, NO, 0);// 获取上下文(画板)CGContextRef ref = UIGraphicsGetCurrentContext();// 把imageView的layer映射到上下文中[self.imageView.layer renderInContext:ref];// 清除划过的区域CGContextClearRect(ref, rect);// 获取图片UIImage *image = UIGraphicsGetImageFromCurrentImageContext();// 结束图片的画板, (意味着图片在上下文中消失)UIGraphicsEndImageContext();self.imageView.image = image;}

缺点很明显:

1、画笔是矩形的,看着很难受;

2、绘画的核心代码用了CoreGraphics,每次移动都要重新开启一个context上下文,绘制image,对CPU的性能有很大的消耗。点击该链接,详细了解CAShapeLayer比CG的优势

所以,我想了一个骚技巧,用CAShapeLayer作为mask来实现该效果。点击该链接,了解mask图层遮罩

原理

如图所示,只要用户滑动的时候,更新contentView的maskLayer的path,就可以实现刮刮乐的效果了。代码如下:

  • 初始化

/// 指定初始化器////// - Parameters:///   - contentView: 内容视图,比如彩票的奖品详情内容。(需要隐藏起来的内容)///   - maskView: 遮罩视图public init(contentView: UIView, maskView: UIView) {super.init(frame: CGRect.zero)scratchMaskView = maskViewself.addSubview(scratchMaskView)scratchContentView = contentViewself.addSubview(scratchContentView)maskLayer = CAShapeLayer()maskLayer.strokeColor = UIColor.red.cgColormaskLayer.lineWidth = strokeLineWidthmaskLayer.lineCap = strokeLineCapscratchContentView?.layer.mask = maskLayermaskPath = UIBezierPath()}
  • 绘画核心代码

open override func touchesBegan(_ touches: Set, with event: UIEvent?) {guard let touch = touches.first else {return}let point = touch.location(in: scratchContentView)maskPath.move(to: point)}open override func touchesMoved(_ touches: Set, with event: UIEvent?) {guard let touch = touches.first else {return}let point = touch.location(in: scratchContentView)maskPath.addLine(to: point)maskPath.move(to: point)maskLayer.path = maskPath.cgPath}
  • 获取已经刮了多少百分比,比如用户刮了70%的时候,就显示全部。

//获取透明像素占总像素的百分比private func getAlphaPixelPercent(img: UIImage) -> Float {//计算像素总个数let width = Int(img.size.width)let height = Int(img.size.height)let bitmapByteCount = width * height//得到所有像素数据let pixelData = UnsafeMutablePointer.allocate(capacity: bitmapByteCount)let colorSpace = CGColorSpaceCreateDeviceGray()let context = CGContext(data: pixelData,width: width,height: height,bitsPerComponent: 8,bytesPerRow: width,space: colorSpace,bitmapInfo: CGBitmapInfo(rawValue:CGImageAlphaInfo.alphaOnly.rawValue).rawValue)!let rect = CGRect(x: 0, y: 0, width: width, height: height)context.clear(rect)context.draw(img.cgImage!, in: rect)//计算透明像素个数var alphaPixelCount = 0for x in 0...Int(width) {for y in 0...Int(height) {if pixelData[y * width + x] == 0 {alphaPixelCount += 1}}}free(pixelData)return Float(alphaPixelCount) / Float(bitmapByteCount)}//展示全部open func showContentView() {self.scratchContentView.layer.mask = nil}

使用

彩票刮刮乐示例代码

        let contentView = UILabel()contentView.backgroundColor = UIColor.whitecontentView.textAlignment = .centercontentView.font = UIFont.systemFont(ofSize: 25)contentView.text = "恭喜你刮中500万"contentView.numberOfLines = 0let maskView = UIView()maskView.backgroundColor = UIColor.lightGraylet ratio = self.bounds.size.width/400scratchView = JXScratchView(contentView: contentView, maskView: maskView)scratchView.delegate = selfscratchView.strokeLineWidth = 25scratchView.strokeLineCap = kCALineCapRoundscratchView.frame = CGRect(x: 33*ratio, y: 140*ratio, width: 337*ratio, height: 154*ratio)addSubview(scratchView)
  • 指定使用JXScratchView的public init(contentView: UIView, maskView: UIView)初始化器,只需要传入UIView及其子类就可以了。

  • strokeLineCap属性设置stroke形状,默认kCALineCapRound

  • strokeLineWidth属性设置stroke线宽,默认20

  • 遵从JXScratchViewDelegate,实现func scratchView(scratchView: JXScratchView, didScratched percent: Float)代理方法,就可以实时获取刮刮乐的百分比。

  • 建议新建一个UIView,把JXScratchView封装进去,可以参考JXScratchTicketView

Github仓库地址

仓库地址,喜欢就star一下 ios-Swift/Object C开发上架审核交流群 869685378 欢迎各位大牛来分享交流 IOS,马甲包,低要求,内容开发没有限制,报酬丰厚,实力诚信 Q:782675105

作者:暴走的鑫鑫

iOS:一用就上瘾的刮刮乐视图相关推荐

  1. iOS 仿支付宝刮刮乐效果

    支付宝里有个刮刮乐中奖, 和大街小巷里的类似彩票刮刮乐的效果一样. 实现思路, 其实很简单的三步: 展示刮出来的效果的view: 即刮开后刮刮乐效果展示-显示的文字Label 设置遮挡在外面的Imag ...

  2. 几行代码实现一用就上瘾的刮刮乐效果

    前言 这是一个简单却功能强大的刮刮乐视图,几行代码就可以实现刮刮乐效果,而且性能良好.下面有美女福利哟,相信我,你会喜欢的

  3. html5 canvas制作刮刮卡

    下班后,闲着无事,刚好近期在学习画布相关知识,就写了个刮刮卡的demo练一下手,兼容安卓.IOS哦.高手路过,多多指点! 刮刮卡实现原理: 通过canvas绘制一个图片,用户手指触发屏幕时,刮开当前一 ...

  4. canvas 绘制刮刮卡

    思路=> 用div来展示刮奖结果,用canvas绘制刮奖前展示的图片或者文字:将canvas叠在div上方,刮奖是只需要操作canvas配合touch事件即可简单完成. canvas刮奖可以用g ...

  5. ScratchCardView:刮刮卡视图组件

    原文链接:https://github.com/pgorzelany/ScratchCardView ScratchCardView:刮刮卡视图组件.# 为开源点赞# -- 由SwiftLanguag ...

  6. 刮刮乐html5效果擦除,利用HTML5的画布Canvas实现刮刮卡效果

    先给大家展示效果: 你玩过刮刮卡么?一不小心可以中奖的那种.今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果. ...

  7. 用python+pygame模块实现一波刮刮卡效果,图像处理之路(附源码)

    前言 利用python模拟了刮开刮刮卡效果,让我们愉快地开始吧~ 效果展示 开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些python自带的模块. 环境搭建 安装P ...

  8. H5活动刮刮卡功能的实现与注意事项

    7月清仓活动有个刮刮卡的功能.找到了个很好用的插件,但是有个坑搞了我好久.就是当覆盖层是个图片的时候老显示跨域的问题. 先附上页面线上地址. https://m.shandjj.com/index.p ...

  9. html制作花样链接卡页面_使用HTML5实现刮刮卡效果

    我们利用HTML5的画布Canvas,结合其提供的API,在Canvas元素上绘制一个灰色蒙层,然后通过检测用户鼠标移到和手势来绘制一个透明的图形,这样就能看到Canvas背景下的真实图片,就达到刮刮 ...

最新文章

  1. UTF8转换为GB编码gb2312转换为utf-8
  2. python爬虫教程网-python爬虫入门10分钟爬取一个网站
  3. php mysql刷新表格_php读入mysql数据并以表格形式显示(表单实现无刷新提交)
  4. 小车故障灯亮显示大全_史上最全汽车故障灯大全,留着一定有用!
  5. [剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]
  6. mycat分布式mysql中间件(自增主键)
  7. ES6新特性_ES6的对象扩展方法---JavaScript_ECMAScript_ES6-ES11新特性工作笔记040
  8. android toast防重_Android-Android中如何防止Toast重复弹出相同的信息?
  9. Unity播放序列帧
  10. 2525 小b的字符串 (字符串思维、dp、胡搞都能过)
  11. 软件安装包制作工具installshield 2020 R1的安装教程
  12. 《阿里巴巴Java开发手册》版本演进历史
  13. J2Cache 知识点总结
  14. edge浏览器登录谷歌账号显示此浏览器或应用可能不安全
  15. 数据库:园林软件(病虫害题库)
  16. 暨阳社区创始人游牧:为什么我们要转型?
  17. [数据集][转载]ImageNet 2012 1000分类名称和编号
  18. 源码时代UI干货分享| AE如何实现文字消散效果?看这一篇就够了!
  19. Linux创建和删除目录
  20. deep supervision

热门文章

  1. android edittext清除功能,Android:带一键清除功能的EditText
  2. 杀毒软件不能为了一己私欲剥夺用户选择权
  3. kali linux安装到U盘 无法启动,vmware 安装 kali linux 系统到U盘 启动错误(initramfs:) 修复方法...
  4. 官宣:Apache Doris 顺利毕业,成为 ASF 顶级项目!
  5. 腾讯会员如何关闭手机号自动续费
  6. 做人要大方包容、善解人意,凡事包容,凡事相信,凡事盼望,凡事忍耐
  7. window10系统 onedrive账号解冻方法
  8. lattice学习笔记-CmosToMipi简明教程
  9. linux搭建文件服务器
  10. 自学XML——基本用法