objective-c – 使用内部阴影在UILabel中发光效果

前端之家收集整理的这篇文章主要介绍了objective-c – 使用内部阴影在UILabel中发光效果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图为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;
}

猜你在找的C&C++相关文章