本转载至 http://bbs.aliyun.com/read/181991.html?spm=5176.7114037.1996646101.25.p0So7c&pos=9

 
 
 

级别: 帮帮团
发帖
487
云币
430
 
只看楼主 更多操作楼主  发表于: 2014-06-10
 
 
 
我想要在IOS中对一些文本进行3D效果渲染,使用了UIKit和标准视图控制器。 
实现之的效果大概能成为这样: 
 
 
能不能通过iOS和UIKit实现?我只用了一个静态PNG图片,文本内容根据用户数据变化。
 
 
 
关键词: ios开发 3D效果

第46期:北京云栖大会、钉钉、快速黑洞、码农成长日记

 
 
 

级别: 小白
发帖
23
云币
45
 
只看该作者沙发  发表于: 2014-06-10
Re如何让IOS中的文本实现3D效果
 
 
提供一个方法,不断的重复画文本的layer,创建有层次的效果: 
创建UIImage Category,命名为UIImage+3d.h文件:

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

.m文件:

  1. //
  2. //  UIImage+3D.m
  3. //
  4. //  Created by Lefteris Haritou on 12/10/12.
  5. //  Feel Free to use this code, but please keep the credits
  6. //
  7. #import "UIImage+3D.h"
  8. @implementation UIImage (Extensions)
  9. + (UIImage *)create3DImageWithText:(NSString *)_text Font:(UIFont*)_font ForegroundColor:(UIColor*)_foregroundColor ShadowColor:(UIColor*)_shadowColor outlineColor:(UIColor*)_outlineColor depth:(int)_depth {
  10. //calculate the size we will need for our text
  11. CGSize expectedSize = [_text sizeWithFont:_font constrainedToSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
  12. //increase our size, as we will draw in 3d, so we need extra space for 3d depth + shadow with blur
  13. expectedSize.height+=_depth+5;
  14. expectedSize.width+=_depth+5;
  15. UIColor *_newColor;
  16. UIGraphicsBeginImageContextWithOptions(expectedSize, NO, [[UIScreen mainScreen] scale]);
  17. CGContextRef context = UIGraphicsGetCurrentContext();
  18. //because we want to do a 3d depth effect, we are going to slightly decrease the color as we move back
  19. //so here we are going to create a color array that we will use with required depth levels
  20. NSMutableArray *_colorsArray = [[NSMutableArray alloc] initWithCapacity:_depth];
  21. CGFloat *components =  (CGFloat *)CGColorGetComponents(_foregroundColor.CGColor);
  22. //add as a first color in our array the original color
  23. [_colorsArray insertObject:_foregroundColor atIndex:0];
  24. //create a gradient of our color (darkening in the depth)
  25. int _colorStepSize = floor(100/_depth);
  26. for (int i=0; i<_depth; i++) {
  27. for (int k=0; k<3; k++) {
  28. if (components[k]>(_colorStepSize/255.f)) {
  29. components[k]-=(_colorStepSize/255.f);
  30. }
  31. }
  32. _newColor = [UIColor colorWithRed:components[0] green:components[1] blue:components[2] alpha:CGColorGetAlpha(_foregroundColor.CGColor)];
  33. //we are inserting always at first index as we want this array of colors to be reversed (darkest color being the last)
  34. [_colorsArray insertObject:_newColor atIndex:0];
  35. }
  36. //we will draw repeated copies of our text, with the outline color and foreground color, starting from the deepest
  37. for (int i=0; i<_depth; i++) {
  38. //change color
  39. _newColor = (UIColor*)[_colorsArray objectAtIndex:i];
  40. //draw the text
  41. CGContextSaveGState(context);
  42. CGContextSetShouldAntialias(context, YES);
  43. //draw outline if this is the last layer (front one)
  44. if (i+1==_depth) {
  45. CGContextSetLineWidth(context, 1);
  46. CGContextSetLineJoin(context, kCGLineJoinRound);
  47. CGContextSetTextDrawingMode(context, kCGTextStroke);
  48. [_outlineColor set];
  49. [_text drawAtPoint:CGPointMake(i, i) withFont:_font];
  50. }
  51. //draw filling
  52. [_newColor set];
  53. CGContextSetTextDrawingMode(context, kCGTextFill);
  54. //if this is the last layer (first one we draw), add the drop shadow too and the outline
  55. if (i==0) {
  56. CGContextSetShadowWithColor(context, CGSizeMake(-2, -2), 4.0f, _shadowColor.CGColor);
  57. }
  58. else if (i+1!=_depth){
  59. //add glow like blur
  60. CGContextSetShadowWithColor(context, CGSizeMake(-1, -1), 3.0f, _newColor.CGColor);
  61. }
  62. [_text drawAtPoint:CGPointMake(i, i) withFont:_font];
  63. CGContextRestoreGState(context);
  64. }
  65. UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
  66. UIGraphicsEndImageContext();
  67. return finalImage;
  68. }
  69. @end

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

  1. 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];
  2. UIImageView *imgView = [[UIImageView alloc] initWithImage:my3dImage];
  3. [self.view addSubview: imgView];

如何让IOS中的文本实现3D效果的更多相关文章

  1. 关于ios中的文本操作-简介

    来源:About Text Handling in iOS 官方文档 iOS平台为我们提供了许多在app中展示文本和让用户编辑文本的方式.同时,它也允许你在app视图中展示格式化的文本和网页内容.你可 ...

  2. iOS中textbox文本框清除圆角

    在iOS.Mac safari中,所有的textbox, select, checkbox都会被强制美化为圆角.但在特殊情况下需要清除圆角时发现iOS中使用以下传统的css无效: border-rad ...

  3. 关于iOS中的文本操作-管理text fields 和 text views

    Managing Text Fields and Text Views 管理UITextField和UITextView实例 UITextField和UITextView的实例拥有两个最主要的功能:展 ...

  4. iOS中 UITextView文本视图 技术分享

    UITextView: 文本视图相比与UITextField直观的区别就是UITextView可以输入多行文字并且可以滚动显示浏览全文. UITextField的用处多,UITextView的用法也不 ...

  5. IOS中一个简单的粒子效果实现

    1.效果图展示 2.实现思路 1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现 2> 关于粒 ...

  6. 谈谈iOS中粘性动画以及果冻效果的实现

    在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: https://github.c ...

  7. 转:谈谈iOS中粘性动画以及果冻效果的实现

    在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲: 第一个分享的主题是 ...

  8. ios中仿蚂蚁森林动画效果

    参考链接:https://www.jianshu.com/p/0ba9d80f8e77 demo下载链接:https://gitee.com/ovix/TreeWithRandomFruitBtn

  9. 文本的3D效果

    HTML <div class="g-box"> <h1>CSS的世界很美</h1> </div> CSS .g-box { wid ...

随机推荐

  1. sparkStreaming 练习

    val updateFunc2 = (iter:Iterator[(String,Seq[Int],Option[Int])])=>{ iter.map{case (x,y,z) => / ...

  2. 【Unity/Kinect】Kinect入门——项目搭建

    本文是Unity Store里的官方Demo包中的ReadMe翻译(别人翻的),介绍了用Unity如何入门搭建起一个Kinect项目工程. 非常感谢下面这位大大的无私奉献! http://www.ma ...

  3. java继承2——类与继承(转)

    一.你了解类吗? 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在pu ...

  4. zip文件内存中解压读取

    // 构造zip输入流 ZipInputStream zip = new ZipInputStream(fis,Charset.forName("gbk")); byte[] tm ...

  5. /dev/sdxx is apparently in use by the system; will not make a filesystem here! 解决方法

    在存储上共享了一个500G的空间,映射到Linux系统提供上,环境由2个节点组成. 一. 测试一: 直接mount 用fdisk 格式化之后如下: [root@rac1 u01]# fdisk -l ...

  6. ARDUINO PWM

    转至:http://www.sl088.com/voyage/2012/10/11506.slboat#.E5.8F.91.E7.8E.B0 http://www.engblaze.com/micro ...

  7. windows 搭建 subversion+TortoiseSVN

    1.版本 (a)Apache 2.2.25:httpd-2.2.25-win32-x86-no_ssl.msi (b)Subversion:Setup-Subversion-1.8.5.msi (c) ...

  8. Jqueruy验证 form表单提交之前的中的数据

    //---表单提交---- $("#destiation_form").submit(function(){ var from_city_value=$("#from_c ...

  9. 总结一发linux常用命令

    显示目录和文件的命令 Ls:用于查看所有文件夹的命令. Dir:用于显示指定文件夹和目录的命令   Tree: 以树状图列出目录内容 Du:显示目录或文件大小 修改目录,文件权限和属主及数组命令 Ch ...

  10. thinkPHP的优缺点

    适合大量重复的工作,但不太灵活...