lianlianbushell 2012-12-17 05:31 采纳率: 0%
浏览 5809
已采纳

IOS中的文本实现3D效果

我想要在IOS中对一些文本进行3D效果渲染,使用了UIKit和标准视图控制器。

实现之的效果大概能成为这样:

enter image description here

能不能通过iOS和UIKit实现?我只用了一个静态PNG图片,文本内容根据用户数据变化。

  • 写回答

2条回答

  • prettYYoyic 2012-12-17 07:43
    关注

    我的方法是,不断的重复画文本的layer,创建有层次的效果:

    我是创建UIImage Category,命名为UIImage+3d,

    .h文件:

    //
    //  UIImage+3D.h
    //
    //  Created by Lefteris Haritou on 12/10/12.
    //  Feel Free to use this code, but please keep the credits
    //
    
    #import <UIKit/UIKit.h>
    
    @interface UIImage (Extensions)
    
    + (UIImage *)create3DImageWithText:(NSString *)_text Font:(UIFont*)_font ForegroundColor:(UIColor*)_foregroundColor ShadowColor:(UIColor*)_shadowColor outlineColor:(UIColor*)_outlineColor depth:(int)_depth;
    
    @end
    

    .m文件:

    //
    //  UIImage+3D.m
    //
    //  Created by Lefteris Haritou on 12/10/12.
    //  Feel Free to use this code, but please keep the credits
    //
    
    #import "UIImage+3D.h"
    
    @implementation UIImage (Extensions)
    
    + (UIImage *)create3DImageWithText:(NSString *)_text Font:(UIFont*)_font ForegroundColor:(UIColor*)_foregroundColor ShadowColor:(UIColor*)_shadowColor outlineColor:(UIColor*)_outlineColor depth:(int)_depth {
    
        //calculate the size we will need for our text
        CGSize expectedSize = [_text sizeWithFont:_font constrainedToSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
    
        //increase our size, as we will draw in 3d, so we need extra space for 3d depth + shadow with blur
        expectedSize.height+=_depth+5;
        expectedSize.width+=_depth+5;
    
        UIColor *_newColor;
    
        UIGraphicsBeginImageContextWithOptions(expectedSize, NO, [[UIScreen mainScreen] scale]);
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        //because we want to do a 3d depth effect, we are going to slightly decrease the color as we move back
        //so here we are going to create a color array that we will use with required depth levels
        NSMutableArray *_colorsArray = [[NSMutableArray alloc] initWithCapacity:_depth];
    
        CGFloat *components =  (CGFloat *)CGColorGetComponents(_foregroundColor.CGColor);
    
        //add as a first color in our array the original color
        [_colorsArray insertObject:_foregroundColor atIndex:0];
    
        //create a gradient of our color (darkening in the depth)
        int _colorStepSize = floor(100/_depth);
    
        for (int i=0; i<_depth; i++) {
    
            for (int k=0; k<3; k++) {
                if (components[k]>(_colorStepSize/255.f)) {
                    components[k]-=(_colorStepSize/255.f);
                }
            }        
            _newColor = [UIColor colorWithRed:components[0] green:components[1] blue:components[2] alpha:CGColorGetAlpha(_foregroundColor.CGColor)];
    
            //we are inserting always at first index as we want this array of colors to be reversed (darkest color being the last)
            [_colorsArray insertObject:_newColor atIndex:0];
        }
    
        //we will draw repeated copies of our text, with the outline color and foreground color, starting from the deepest
        for (int i=0; i<_depth; i++) {
    
            //change color
            _newColor = (UIColor*)[_colorsArray objectAtIndex:i];
    
            //draw the text
            CGContextSaveGState(context);
    
            CGContextSetShouldAntialias(context, YES);        
    
            //draw outline if this is the last layer (front one)
            if (i+1==_depth) {
                CGContextSetLineWidth(context, 1);
                CGContextSetLineJoin(context, kCGLineJoinRound);
    
                CGContextSetTextDrawingMode(context, kCGTextStroke);
                [_outlineColor set];
                [_text drawAtPoint:CGPointMake(i, i) withFont:_font];
            }
    
            //draw filling        
            [_newColor set];
    
            CGContextSetTextDrawingMode(context, kCGTextFill);
    
            //if this is the last layer (first one we draw), add the drop shadow too and the outline
            if (i==0) {
                CGContextSetShadowWithColor(context, CGSizeMake(-2, -2), 4.0f, _shadowColor.CGColor);
            }
            else if (i+1!=_depth){
                //add glow like blur
                CGContextSetShadowWithColor(context, CGSizeMake(-1, -1), 3.0f, _newColor.CGColor);
            }
    
            [_text drawAtPoint:CGPointMake(i, i) withFont:_font];
            CGContextRestoreGState(context);        
        }
    
        UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return finalImage;
    }
    
    
    @end
    

    导入category扩展然后如下使用:

    UIImage *my3dImage = [UIImage create3DImageWithText:@"3" Font:[UIFont systemFontOfSize:250] ForegroundColor:[UIColor colorWithRed:(200/255.f) green:(200/255.f) blue:(200/255.f) alpha:1.0] ShadowColor:[UIColor blackColor] outlineColor:[UIColor colorWithRed:(225/255.f) green:(225/255.f) blue:(225/255.f) alpha:1.0] depth:8];
    UIImageView *imgView = [[UIImageView alloc] initWithImage:my3dImage];
    [self.view addSubview: imgView];
    

    图片效果:

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题