我试图为UILabel实现这种发光效果,如下所示:
我已经将UILabel子类化,并创建了一个自定义标签类,可以添加外部阴影.
编辑:这是我在自定义Label类中用于外部阴影/发光的代码:
- (void)drawTextInRect:(CGRect)rect { UIColor *insideColor; UIColor *blurColor; CGContextRef ctx = UIGraphicsGetCurrentContext(); insideColor =[UIColor colorWithRed:255/255.0 green:255/255.0 blue:191/255.0 alpha:1]; blurColor =[UIColor orangeColor]; CGContextSetFillColorWithColor(ctx,insideColor.CGColor); CGContextSetShadowWithColor(ctx,CGSizeMake(0,0),self.glowAmount,blurColor.CGColor); CGContextSetTextDrawingMode(ctx,kCGTextFillStroke); [self.text drawInRect:self.bounds withFont:self.font lineBreakMode:self.lineBreakMode alignment:self.textAlignment]; }
但这给了我以下结果
正如你所看到的,由于缺少内阴影,这缺乏预期的效果.谁能建议如何实现这一目标?
谢谢!
解决方法
我将史蒂芬XM的答案提到了
Inner Shadow in UILabel.这是一个很大的帮助.
这是我为实现结果所做的工作,但我想知道这是否可以更优化?
-(void)setInnerGlowWithColor:(UIColor *)shadowColor fillColor:(UIColor *)insideColor inRect:(CGRect)rect { UIFont *font = self.font; // UIFont *font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:17]; CGSize fontSize = [self.text sizeWithFont:font]; /**** Following are the steps to create an inside shadow ****/ // STEP 1 : Create a image mask of your text. CGImageRef mask = [self createMaskWithSize:rect.size shape:^{ [[UIColor blackColor] setFill]; CGContextFillRect(UIGraphicsGetCurrentContext(),rect); [[UIColor whiteColor] setFill]; // custom shape goes here [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2),0) withFont:font]; }]; // STEP 2 : Invert that mask. CGImageRef cutoutRef = CGImageCreateWithMask([self blackSquareOfSize:rect.size].CGImage,mask); CGImageRelease(mask); UIImage *cutout = [UIImage imageWithCGImage:cutoutRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp]; CGImageRelease(cutoutRef); // STEP 3 : Use this inverted mask to draw a shadow around the inside edges of the text. CGImageRef shadedMask = [self createMaskWithSize:rect.size shape:^{ [[UIColor whiteColor] setFill]; CGContextFillRect(UIGraphicsGetCurrentContext(),rect); //****************For inner shadow/glow NSLog(@"in custom label----> %f",self.glowAmount); CGContextSetShadowWithColor(UIGraphicsGetCurrentContext(),shadowColor.CGColor); [cutout drawAtPoint:CGPointZero]; }]; // STEP 4 : Create negative image UIGraphicsBeginImageContextWithOptions(rect.size,NO,0); [shadowColor setFill]; // custom shape goes here [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2),0) withFont:font]; UIImage *negative = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // STEP 5 : Create the shadow image CGImageRef innerShadowRef = CGImageCreateWithMask(negative.CGImage,shadedMask); CGImageRelease(shadedMask); UIImage *innerShadow = [UIImage imageWithCGImage:innerShadowRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp]; CGImageRelease(innerShadowRef); // STEP 6 : Draw actual text [insideColor setFill]; [self.text drawAtPoint:CGPointMake((self.bounds.size.width/2)-(fontSize.width/2),0) withFont:font]; // STEP 7 : Finally apply the shadow image [innerShadow drawAtPoint:CGPointZero]; } - (UIImage*)blackSquareOfSize:(CGSize)size { UIGraphicsBeginImageContextWithOptions(size,0); [[UIColor blackColor] setFill]; CGContextFillRect(UIGraphicsGetCurrentContext(),CGRectMake(0,size.width,size.height)); UIImage *blackSquare = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return blackSquare; } - (CGImageRef)createMaskWithSize:(CGSize)size shape:(void (^)(void))block { UIGraphicsBeginImageContextWithOptions(size,0); block(); CGImageRef shape = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; UIGraphicsEndImageContext(); CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(shape),CGImageGetHeight(shape),CGImageGetBitsPerComponent(shape),CGImageGetBitsPerPixel(shape),CGImageGetBytesPerRow(shape),CGImageGetDataProvider(shape),NULL,false); return mask; }