Für alle anderen, die sich fragen, wie sie mit Core Graphics gemäß Costique-Vorschlag einen inneren Schatten zeichnen sollen, gilt Folgendes: (unter iOS nach Bedarf anpassen)
In Ihrer drawRect: Methode ...
CGRect bounds = [self bounds];
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat radius = 0.5f * CGRectGetHeight(bounds);
// Create the "visible" path, which will be the shape that gets the inner shadow
// In this case it's just a rounded rect, but could be as complex as your want
CGMutablePathRef visiblePath = CGPathCreateMutable();
CGRect innerRect = CGRectInset(bounds, radius, radius);
CGPathMoveToPoint(visiblePath, NULL, innerRect.origin.x, bounds.origin.y);
CGPathAddLineToPoint(visiblePath, NULL, innerRect.origin.x + innerRect.size.width, bounds.origin.y);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, bounds.origin.y, bounds.origin.x + bounds.size.width, innerRect.origin.y, radius);
CGPathAddLineToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, innerRect.origin.y + innerRect.size.height);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height, innerRect.origin.x + innerRect.size.width, bounds.origin.y + bounds.size.height, radius);
CGPathAddLineToPoint(visiblePath, NULL, innerRect.origin.x, bounds.origin.y + bounds.size.height);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x, bounds.origin.y + bounds.size.height, bounds.origin.x, innerRect.origin.y + innerRect.size.height, radius);
CGPathAddLineToPoint(visiblePath, NULL, bounds.origin.x, innerRect.origin.y);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x, bounds.origin.y, innerRect.origin.x, bounds.origin.y, radius);
CGPathCloseSubpath(visiblePath);
// Fill this path
UIColor *aColor = [UIColor redColor];
[aColor setFill];
CGContextAddPath(context, visiblePath);
CGContextFillPath(context);
// Now create a larger rectangle, which we're going to subtract the visible path from
// and apply a shadow
CGMutablePathRef path = CGPathCreateMutable();
//(when drawing the shadow for a path whichs bounding box is not known pass "CGPathGetPathBoundingBox(visiblePath)" instead of "bounds" in the following line:)
//-42 cuould just be any offset > 0
CGPathAddRect(path, NULL, CGRectInset(bounds, -42, -42));
// Add the visible path (so that it gets subtracted for the shadow)
CGPathAddPath(path, NULL, visiblePath);
CGPathCloseSubpath(path);
// Add the visible paths as the clipping path to the context
CGContextAddPath(context, visiblePath);
CGContextClip(context);
// Now setup the shadow properties on the context
aColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f];
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 1.0f), 3.0f, [aColor CGColor]);
// Now fill the rectangle, so the shadow gets drawn
[aColor setFill];
CGContextSaveGState(context);
CGContextAddPath(context, path);
CGContextEOFillPath(context);
// Release the paths
CGPathRelease(path);
CGPathRelease(visiblePath);
Im Wesentlichen gibt es also die folgenden Schritte:
- Erstellen Sie Ihren Weg
- Stellen Sie die gewünschte Füllfarbe ein, fügen Sie diesen Pfad dem Kontext hinzu und füllen Sie den Kontext
- Erstellen Sie nun ein größeres Rechteck, das den sichtbaren Pfad begrenzen kann. Fügen Sie den sichtbaren Pfad hinzu, bevor Sie diesen Pfad schließen. Schließen Sie dann den Pfad, sodass Sie eine Form erstellen, von der der sichtbare Pfad abgezogen wird. Abhängig davon, wie Sie diese Pfade erstellt haben, möchten Sie möglicherweise die Füllmethoden untersuchen (Wicklung ungerade ungerade / ungerade). Um die Unterpfade beim Addieren zu "subtrahieren", müssen Sie sie im Wesentlichen im Uhrzeigersinn und gegen den Uhrzeigersinn in entgegengesetzte Richtungen zeichnen (oder vielmehr konstruieren).
- Dann müssen Sie Ihren sichtbaren Pfad als Beschneidungspfad für den Kontext festlegen, damit Sie nichts außerhalb davon auf den Bildschirm zeichnen.
- Richten Sie dann den Schatten im Kontext ein, der den Versatz, die Unschärfe und die Farbe enthält.
- Dann füllen Sie die große Form mit dem Loch darin. Die Farbe spielt keine Rolle, denn wenn Sie alles richtig gemacht haben, sehen Sie diese Farbe nicht, nur den Schatten.