绝地无双
对于任何其他想知道如何根据Costique建议使用Core Graphics绘制内部阴影的人,这就是如何:(在iOS上根据需要进行调整)在您的drawRect:方法中...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 wantCGMutablePathRef 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 pathUIColor *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 shadowCGMutablePathRef 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 > 0CGPathAddRect(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 contextCGContextAddPath(context, visiblePath); CGContextClip(context); // Now setup the shadow properties on the contextaColor = [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 pathsCGPathRelease(path); CGPathRelease(visiblePath);因此,基本上有以下步骤:创建你的道路设置所需的填充颜色,将此路径添加到上下文中,然后填充上下文现在创建一个更大的矩形,可以绑定可见路径。在关闭此路径之前,请添加可见路径。然后关闭路径,以便创建一个形状,其中减去了可见路径。您可能要研究填充方法(偶数/奇数的非零缠绕),具体取决于创建这些路径的方式。本质上,要使子路径在将它们添加在一起时“减去”,您需要沿相反的方向(一个顺时针方向,另一个逆时针方向)绘制(或构造)它们。然后,您需要将可见路径设置为上下文上的剪切路径,以免在屏幕外绘制任何内容。然后在上下文上设置阴影,包括阴影,模糊和颜色。然后在大形状中填充孔。颜色无关紧要,因为如果您正确完成所有操作,就不会看到此颜色,而只会看到阴影。