写真に線を引くことができる写真アプリを開発中です。背景は写真で、drawrectを介してサブビューに線を描画します。
すべてが機能しますが、(消しゴムのように)サブビューの行を消去するにはどうすればよいですか?clearColorをsetStrokeとして使用してみました。
このように線を消すことはできますか?
写真に線を引くことができる写真アプリを開発中です。背景は写真で、drawrectを介してサブビューに線を描画します。
すべてが機能しますが、(消しゴムのように)サブビューの行を消去するにはどうすればよいですか?clearColorをsetStrokeとして使用してみました。
このように線を消すことはできますか?
kCGBlendModeCopy
完全に透明な色で描画したい場合は、ブレンド モードを に設定する必要があります。
これは通常、CGContextSetBlendMode
関数で行われます。UIBezierPath
描画に使用する場合は、strokeWithBlendMode:alpha:
メソッドを使用することもできます。
@omz によって与えられた応答の実装は次のようになります:
( viewcontrollerのメイン ビューの上に配置されてimgBlank
いると仮定します)UIImageView
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self.imgBlank];
NSValue *valCurrPoint=[NSValue valueWithCGPoint:CGPointMake(currentPoint.x, currentPoint.y)];
[self.dots addObject:valCurrPoint];
[self performSelector:@selector(draw:) withObject:valCurrPoint afterDelay:0];
}
-(void)draw:(NSValue*)pointz{
CGPoint point=[pointz CGPointValue];
UIGraphicsBeginImageContextWithOptions(self.imgBlank.frame.size,NO,0);
[self.imgBlank.image drawInRect:CGRectMake(0, 0, self.imgBlank.frame.size.width, self.imgBlank.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(),tickness);//set the tickness here
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0f, 1.0f, 1.0f, 1.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), YES);
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), _lastPoint.x, _lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), point.x, point.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
self.imgBlank.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
_lastPoint = point;
}
strokeWithBlendMode:alpha: を使用して UIBezierPath でこれを行うという@omzの2番目の提案を使用してみましたが、うまくいきました。コードは次のとおりです。
if (pen) {
[self updateColorFromPen];
[path setLineWidth:3.0];
} else if (eraser) {
[[UIColor clearColor] setStroke];
[path setLineWidth:42.0];
[path strokeWithBlendMode:kCGBlendModeCopy alpha:1];
}