iOS 如何将阴影应用于UIBezierPath
示例
考虑一个由贝塞尔曲线路径绘制的简单矩形。
UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(x,y,width,height)]; [UIColor.grayColor setFill]; [rectanglePath fill];
基本的外部填充阴影:
CGContextRef context = UIGraphicsGetCurrentContext(); NSShadow* shadow = [[NSShadow alloc] init]; [shadow setShadowColor: UIColor.blackColor]; [shadow setShadowOffset: CGSizeMake(7.1, 5.1)]; [shadow setShadowBlurRadius: 5]; UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(x,y,width,height)]; CGContextSaveGState(context); CGContextSetShadowWithColor(context, shadow.shadowOffset, shadow.shadowBlurRadius, [shadow.shadowColor CGColor]); [UIColor.grayColor setFill]; [rectanglePath fill]; CGContextRestoreGState(context);
基本的内部填充阴影:
CGContextRef context = UIGraphicsGetCurrentContext(); NSShadow* shadow = [[NSShadow alloc] init]; [shadow setShadowColor: UIColor.blackColor]; [shadow setShadowOffset: CGSizeMake(9.1, -7.1)]; [shadow setShadowBlurRadius: 6]; UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(x,y,width,height)]; [UIColor.grayColor setFill]; [rectanglePath fill]; CGContextSaveGState(context); UIRectClip(rectanglePath.bounds); CGContextSetShadowWithColor(context, CGSizeZero, 0, NULL); CGContextSetAlpha(context, CGColorGetAlpha([shadow.shadowColor CGColor])); CGContextBeginTransparencyLayer(context, NULL); { UIColor* opaqueShadow = [shadow.shadowColor colorWithAlphaComponent: 1]; CGContextSetShadowWithColor(context, shadow.shadowOffset, shadow.shadowBlurRadius, [opaqueShadow CGColor]); CGContextSetBlendMode(context, kCGBlendModeSourceOut); CGContextBeginTransparencyLayer(context, NULL); [opaqueShadow setFill]; [rectanglePath fill]; CGContextEndTransparencyLayer(context); } CGContextEndTransparencyLayer(context); CGContextRestoreGState(context);