如何让IOS中的文本实现3D效果

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

 
 

zhedianshi

级别: 帮帮团

发帖
487
云币
430

只看楼主 更多操作楼主  发表于: 2014-06-10

我想要在IOS中对一些文本进行3D效果渲染,使用了UIKit和标准视图控制器。 
实现之的效果大概能成为这样: 
 
 
能不能通过iOS和UIKit实现?我只用了一个静态PNG图片,文本内容根据用户数据变化。

关键词: ios开发 3D效果

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

分享到淘江湖新浪QQ微博QQ空间开心人人豆瓣网易微博百度鲜果白社会飞信

回复引用

举报

 

深白色

级别: 小白

发帖
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];
时间: 2024-10-29 04:46:23

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

?关于ios中的点赞控件效果的实现--UIControl

关于ios中的点赞控件效果的实现--UIControl 在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View-->UIControl的容器, 内部包含了UILabel和UIImage,以及一些排版规则.用UIButton就很难去做一些在"赞"和"取消赞"切换时的效果. 可是我们又很需要UIButton似的事件响应机制. 怎么办? 对! 就是使用UIControl. UIControl在这里有两个突出的优势

iOS中的文本框(UITextField)

#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UI

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

在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲: 第一个分享的主题是“如何让CALayer发生形变”,这个技术在我之前一个项目 ———— KYCuteView 中有涉及,也写了篇简短的实现原理博文.今天再举一个例子. 之前我也做过类似果冻效果的弹性动画,比如这个项目—— KYGooeyMenu.用到的核心技术是CAKeyframeAnimation,然后设置几个不同

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

在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: https://github.com/KittenYang/KYAnimatedPageControl 先做个提纲: 第一个分享的主题是“如何让CALayer发生形变”,这个技术在我之前一个项目 ———— KYCuteView 中有涉及,也写了篇简短的实现原理博文.今天再举一个例子. 之前我也做过类似果冻效果的弹性动画,比如这个项

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

1.效果图展示 2.实现思路 1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现 2> 关于粒子效果的实现,可以创建一个CALayer,然后用CAReplicatorLayer进行复制layer,从而达到粒子效果 3.代码实现 DrawView类的封装与编写 // // DrawView.m // 06-粒子效果 // // Created by xiaomage on 15/6/24. // Cop

山寨“饿了么”应用中添加菜品数量按钮效果

山寨“饿了么”应用中添加菜品数量按钮效果 本人视频教程系类   iOS中CALayer的使用 最终效果: 山寨源头: 源码:(此源码解决了重用问题,可以放心的放在cell中使用) AddAndDeleteButton.h 与 AddAndDeleteButton.m // // AddAndDeleteButton.h // LabelControll // // Created by YouXianMing on 14/12/11. // Copyright (c) 2014年 YouXian

iOS中几种数据持久化方案

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为"沙盒". 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧

善用iOS中webview(转)

iOS开发中webview和native code写这是一件纠结的事?我写这篇文章, 介绍一下我做iOS两年来总结的一些在webview和native code的配合上的一些经验和技巧,当然,都是基于互联网App的,希望对大家有所帮助. 首先提两句两者的优劣?webview与运维成本低, 更新几乎不依赖App的版本:但在交互和性能上与跟native code有很大差距.native code与之对应. 注,我这里不说HTML5,因为我认为,HTML5确实给web带入了一个新时代.这个时代是什么,

iOS中xib与storyboard原理,与Android界面布局的异同

用文本标记语言来进行布局,用的最多的应该是HTML语言.HTML可以理解为有一组特殊标记的XML语言. 一.iOS中xib与storyboard显示原理 在iOS中主要的布置界面的方式有3种:代码,xib,storyboard. 1. 代码 代码布置界面是万能的,但通常很复杂.布置一个简单的界面可能需要很多行代码,因此十分繁琐. 下面为创建一个按钮的代码,最少也要3行: UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd