我试图为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;
- }