Mam problem z zaimplementowaniem "Efektów wytłoczeń/cieni" na moim rysunku. Funkcjonalność farba palec obecnie pracuje w porządku z moim zwyczajem UIView
i poniżej jest mój kod drawRect
metoda:Tworzenie wytłoczonych lub cieniowanych efektów za pomocą grafiki głównej (do malowania palcami)
Edycja kodu ze wszystkich metod:
- (void)drawRect:(CGRect)rect
{
CGPoint mid1 = midPoint(previousPoint1, previousPoint2);
CGPoint mid2 = midPoint(currentPoint, previousPoint1);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.layer renderInContext:context];
CGContextMoveToPoint(context, mid1.x, mid1.y);
CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, self.lineWidth);
CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
CGContextSaveGState(context);
// for shadow effects
CGContextSetShadowWithColor(context, CGSizeMake(0, 2),3, self.lineColor.CGColor);
CGContextStrokePath(context);
[super drawRect:rect];
}
CGPoint midPoint(CGPoint p1, CGPoint p2)
{
return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5);
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
previousPoint1 = [touch previousLocationInView:self];
previousPoint2 = [touch previousLocationInView:self];
currentPoint = [touch locationInView:self];
[self touchesMoved:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
previousPoint2 = previousPoint1;
previousPoint1 = [touch previousLocationInView:self];
currentPoint = [touch locationInView:self];
// calculate mid point
CGPoint mid1 = midPoint(previousPoint1, previousPoint2);
CGPoint mid2 = midPoint(currentPoint, previousPoint1);
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, mid1.x, mid1.y);
CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
CGRect bounds = CGPathGetBoundingBox(path);
CGPathRelease(path);
CGRect drawBox = bounds;
//Pad our values so the bounding box respects our line width
drawBox.origin.x -= self.lineWidth * 2;
drawBox.origin.y -= self.lineWidth * 2;
drawBox.size.width += self.lineWidth * 4;
drawBox.size.height += self.lineWidth * 4;
UIGraphicsBeginImageContext(drawBox.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
curImage = UIGraphicsGetImageFromCurrentImageContext();
[curImage retain];
UIGraphicsEndImageContext();
[self setNeedsDisplayInRect:drawBox];
}
kiedy wdrożyły ten otrzymuję efektów malarskich z kropką kropka kropka ...
Zobacz poniżej zdjęcie (które nie ma cienia ani efektów wytłaczanych). Jeśli masz pojęcie, jak dodać te efekty, daj mi trochę sugestii. Jak mogę to rozwiązać?
Doceniłem twoją sugestię. użyłem UIBezierPath i zaimplementowałem go, ale napotykamy na pewne problemy, takie jak wymazywanie funkcjonalności i wybieranie innego koloru farby ... więc w końcu zmieniłem funkcjonalność i użyłem CGContext. teraz wszystkie funkcje, takie jak Erase, zmiana koloru pędzla działa dobrze. tkwi tylko do tworzenia efektów wytłoczenia lub cienia. że efekty nie działają prawidłowo. linia prosta działa dobrze z efektami cieni. ale efekty krzywych (gładkie) nie działają dobrze. plz powiedz mi trochę sugestii używając CGContext. – Hitarth
Szybkie pytanie: Jak chcesz, aby Erase działał? Większość programów "rysujących" usunie każdą oddzielną "ścieżkę" (zdefiniowaną jako jedno dotknięcie/przeciągnięcie/zakończenie zdarzenia). Działa to z moją sugestią/odpowiedzią. Jednakże, jeśli próbujesz usunąć każdy punkt ścieżki lub nawet każdy piksel ... który będzie znacznie trudniejszy do osiągnięcia. –
Wymazywanie przy użyciu bieżącego kontekstu. i działa dobrze. – Hitarth