文档章节

IOS7-刮刮奖效果

Durian_2012
 Durian_2012
发布于 2013/12/31 13:12
字数 495
阅读 285
收藏 0

ImageMaskView.h <!-- lang: cpp --> // // ImageMaskView.h #import <UIKit/UIKit.h>

@interface ImageMaskView : UIImageView

@property (nonatomic, readonly) BOOL canShowResult;
@property (nonatomic) BOOL result;

@property (nonatomic, readonly) double percentsOfImageMasked;

- (id)initWithFrame:(CGRect)frame image:(UIImage *)img withResult:(BOOL)result;

@end

ImageMaskView.m: <!-- lang: cpp --> // // ImageMaskView.m

#import "ImageMaskView.h"

@interface ImageMaskView()

@property (nonatomic) CGContextRef imageContext;
@property (nonatomic) CGColorSpaceRef colorSpace;
@property (nonatomic) float scaleOfBrash;

@property (nonatomic, readwrite) BOOL canShowResult;

@property (nonatomic, readwrite) double percentsOfImageMasked;

- (UIImage *)handleTouches:(NSSet *)touches;

@end

@implementation ImageMaskView

@synthesize imageContext;
@synthesize colorSpace;
@synthesize percentsOfImageMasked;
@synthesize scaleOfBrash = _scaleOfBrash;
@synthesize result = _result;

#pragma mark - Initinal

- (id)initWithFrame:(CGRect)frame image:(UIImage *)img withResult:(BOOL)result
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.userInteractionEnabled = YES;
        self.backgroundColor = [UIColor clearColor];
        
        self.image = img;
        self.percentsOfImageMasked = 0.0;
        self.canShowResult = NO;
        self.result = result;
        
        // initalize bitmap context
        self.colorSpace = CGColorSpaceCreateDeviceRGB();
        self.imageContext = CGBitmapContextCreate(0, self.bounds.size.width, self.bounds.size.height, 8,
                                            self.bounds.size.width * 4, self.colorSpace, kCGImageAlphaPremultipliedLast);
        CGContextDrawImage(self.imageContext, CGRectMake(0, 0, self.bounds.size.width,         
                                                self.bounds.size.height), self.image.CGImage);
        
        CGContextSetBlendMode(self.imageContext, kCGBlendModeClear);
    }
    return self;
}

#define DEFAULT_SCALE_OF_BRASH 20.0

- (float)scaleOfBrash
{
    if (!_scaleOfBrash) _scaleOfBrash = DEFAULT_SCALE_OF_BRASH;
    return _scaleOfBrash;
}

#pragma  mark - UIResponder

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.image = [self handleTouches:touches];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.image = [self handleTouches:touches];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.image = [self handleTouches:touches];
}

#pragma mark -

- (UIImage *)handleTouches:(NSSet *)touches
{
    CGContextSetFillColorWithColor(self.imageContext, [UIColor clearColor].CGColor);
    CGContextSetStrokeColorWithColor(self.imageContext, [UIColor colorWithRed:0 green:0 blue:0     
                                                            alpha:0].CGColor);
    
    //process Touches
    for (UITouch *touch in touches) {
        CGContextBeginPath(self.imageContext);
        CGPoint touchPoint = [touch locationInView:self];
        touchPoint.y = self.bounds.size.height - touchPoint.y;
        
        CGRect rect = CGRectMake(touchPoint.x - self.scaleOfBrash / 2.0, touchPoint.y - self.scaleOfBrash / 2.0,     
                                                self.scaleOfBrash, self.scaleOfBrash);
        
        if (UITouchPhaseBegan == touch.phase) {
            //on began, we just draw a ellipse
            CGContextAddEllipseInRect(self.imageContext, rect);
            CGContextFillPath(self.imageContext);
            CGContextStrokePath(self.imageContext);
            
            if (CGRectContainsPoint(CGRectMake(self.bounds.origin.x + self.bounds.size.width / 2.0 - 50.0,     
                        self.bounds.origin.y + self.bounds.size.height / 2.0 - 50.0, 100.0, 100.0), touchPoint)) {
                self.canShowResult = YES;
            }
            
        } else if (UITouchPhaseMoved == touch.phase) {
            //then touch moved, we draw superior-width line
            CGPoint prevPoint = [touch previousLocationInView:self];
            prevPoint.y = self.bounds.size.height - prevPoint.y;
            
            CGContextSetStrokeColor(self.imageContext, CGColorGetComponents([UIColor     
                                                    yellowColor].CGColor));
            CGContextSetLineCap(self.imageContext, kCGLineCapRound);
            CGContextSetLineWidth(self.imageContext, self.scaleOfBrash);
            CGContextMoveToPoint(self.imageContext, prevPoint.x, prevPoint.y);
            CGContextAddLineToPoint(self.imageContext, rect.origin.x + rect.size.width / 2.0, rect.origin.y +     
                                                    rect.size.height / 2.0);
            CGContextStrokePath(self.imageContext);
            
            if (CGRectContainsPoint(CGRectMake(self.bounds.origin.x + self.bounds.size.width / 2.0 - 50.0,     
                            self.bounds.origin.y + self.bounds.size.height / 2.0 - 50.0, 100.0, 100.0), prevPoint)) {
                self.canShowResult = YES;
            }
        } else if (UITouchPhaseEnded == touch.phase) {
            if (self.canShowResult) [self showResult];
            
            return nil;
        }
    }
    
    CGImageRef cgImage = CGBitmapContextCreateImage(self.imageContext);
    UIImage *image = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);
    
    return image;
}

- (void)showResult
{
    if (self.result) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:@"Congratuation!"     
                                    delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertView show];
    } else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:@"Sorry!" delegate:nil     
                                    cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertView show];    
    }
        
    }
    
    @end

ViewController.m

<!-- lang: cpp -->
- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    [self myInit];
}

- (IBAction)tryAgain:(UIButton *)sender
{
    [self myInit];
}

- (void)myInit
{
    UIImageView *backImageView = [[UIImageView alloc] initWithFrame:self.scratchView.bounds];
    
    BOOL result = NO;
    if (arc4random() % 100 >= 50) result = YES;
    if (result) {
        backImageView.image = [UIImage imageNamed:@"back_2"];
    } else {
        backImageView.image = [UIImage imageNamed:@"back_1"];
    }
    [self.scratchView addSubview:backImageView];
    
    ImageMaskView *frontImageView = [[ImageMaskView alloc] initWithFrame:self.scratchView.bounds image:    
                                                                [UIImage imageNamed:@"front"] withResult:result];
    [self.scratchView addSubview:frontImageView];

}

效果图: 在此输入图片描述

在此输入图片描述

在此输入图片描述

© 著作权归作者所有

共有 人打赏支持
Durian_2012
粉丝 1
博文 32
码字总数 4883
作品 0
徐汇
私信 提问
Android项目刮刮奖详解(二)

Android项目刮刮奖详解(一) 前言 上期我们简单地实现了一个画板的功能,用户可以在上面乱写乱画,其实,刮刮奖也是如此,用户刮奖的时候也是乱写乱画的。 刮刮奖原理 一共有两层画布,底层...

Stars-one
2018/08/20
0
0
Android项目刮刮奖详解(三)

Android项目刮刮奖详解(二) 前言 上一期我们已经实现了一个简易的刮刮卡功能,这一期我们来将其完善一下 目标 将刮刮奖的宽高改为合适高度 将刮刮奖位置居中 将信息层的图片换成文字(重点...

Stars-one
2018/08/21
0
0
使用border-image实现类似iOS7的1px底边 --适用于高清屏&Retina

使用border-image实现类似iOS7的1px底边 iOS7已经发布有一段时间,扁平化设计风格有很多值得称赞的地方,其中有很多设计细节都是值得研究的。 首先,来看下面iOS设置的截图中的border: 从上...

陈文亮
2015/03/01
5
0
iOS开发技巧(系列十三:UIRefreshControl下拉刷新)

其实UIRefreshControl的效果还是蛮不错的,所以特地学习了下,在此与大家分享。 UIRefreshControl使用非常简单,但是必须是在UITableViewController子类使用,而不能在UIViewController子类中...

召唤攻城狮
2014/05/23
0
1
iOS5、6、7状态栏适配方法

由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,所以了,我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,...

三只脚的猪
2014/03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JDK1.8新特性

1.Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫扩展方法。 2.Lambda 表达式。参数 => 主体。Lambda表达返回右边表达式的结果。 3.用 :: 关键...

无精疯
17分钟前
0
0
http_load压测服务器

1.下载http_load ,下载地址:http://acme.com/software/http_load/http_load-12mar2006.tar.gz [root@localhost ~]#cd /usr/local[root@localhost local]#mkdir http_load[root@loc......

win_ball
19分钟前
0
0
Spark集群安装方式2

环境: jdk1.8、hadoop-2.7、spark-1.6、三台centos7(如下List-1所示) List-1 如下30上部署master;31上部署worker1;32上部署worker2 192.168.33.30 master192.168.33.31 worker1192.168.......

克虏伯
33分钟前
2
0
java File常用的方法

import java.io.File; public class a_22 { public static void main(String[] args) {File f= new File("D:\\tianya\\2019.3.14\\html");System.out.println(f.isDirectory());Syste......

南桥北木
41分钟前
2
0
Go基础系列:双层channel用法示例

双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,...

echojson
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部