找出CGContext是否包含特定区域 - iPhone

时间:2013-09-05 07:38:03

标签: iphone ios ipad uiimage cgcontextref

我指的是这段代码 - Create masking effect over a view 产生刮刮卡效果。现在,我想在特定区域说出(100,100,70,50)被划伤时显示特定的动画。

或者就此而言,我只是想知道用户是否划伤了整个上层以显示动画。

我们可以知道哪个区域有划痕,哪些区域没有?

虽然我提供了链接,但我还会包含希望以这种方式快速回复的代码。 :)

#import "ScratchableView.h"


@implementation ScratchableView


- (id)initWithFrame:(CGRect)frame {

self = [super initWithFrame:frame];
if (self) {
    scratchable = [UIImage imageNamed:@"screen1.png"].CGImage;
    width = CGImageGetWidth(scratchable);
    height = CGImageGetHeight(scratchable);
    self.opaque = NO;
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();

    CFMutableDataRef pixels = CFDataCreateMutable( NULL , width * height );
    alphaPixels = CGBitmapContextCreate( CFDataGetMutableBytePtr( pixels ) , width , height , 8 , width , colorspace , kCGImageAlphaNone );
    provider = CGDataProviderCreateWithCFData(pixels);


    CGContextSetFillColorWithColor(alphaPixels, [UIColor blackColor].CGColor);
    CGContextFillRect(alphaPixels, frame);

    CGContextSetStrokeColorWithColor(alphaPixels, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(alphaPixels, 50.0);
    CGContextSetLineCap(alphaPixels, kCGLineCapRound);

    CGImageRef mask = CGImageMaskCreate(width, height, 8, 8, width, provider, nil, NO);
    scratched = CGImageCreateWithMask(scratchable, mask);

    CGImageRelease(mask);
    CGColorSpaceRelease(colorspace);
}
return self;
}

- (void)drawRect:(CGRect)rect {
CGContextDrawImage(UIGraphicsGetCurrentContext() , [self bounds] , scratched);
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ 
UITouch *touch = [[event touchesForView:self] anyObject];
firstTouch = YES;
location = [touch locationInView:self];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event touchesForView:self] anyObject];

if (firstTouch) {
    firstTouch = NO;
    previousLocation = [touch previousLocationInView:self];
} else {
    location = [touch locationInView:self];
    previousLocation = [touch previousLocationInView:self];
}

// Render the stroke
[self renderLineFromPoint:previousLocation toPoint:location];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{  
UITouch *touch = [[event touchesForView:self] anyObject];
if (firstTouch) {
    firstTouch = NO;
    previousLocation = [touch previousLocationInView:self];


    [self renderLineFromPoint:previousLocation toPoint:location];
}


}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
}

- (void) renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end {

CGContextMoveToPoint(alphaPixels, start.x, start.y);
CGContextAddLineToPoint(alphaPixels, end.x, end.y);
CGContextStrokePath(alphaPixels);
[self setNeedsDisplay];
}

- (void)dealloc {
CGContextRelease(alphaPixels);
CGImageRelease(scratchable);
CGDataProviderRelease(provider);
    [super dealloc];
}

0 个答案:

没有答案