iOS动画详解(一)
Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、
- - (void) drawRect: (CGRect) rect {
-
- UIBezierPath* p = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(,,,)];
-
- [[UIColor blueColor] setFill];
-
- [p fill];
-
- }
第二种绘图形式:使用Core Graphics实现绘制蓝色圆。
- - (void) drawRect: (CGRect) rect {
-
- CGContextRef con = UIGraphicsGetCurrentContext();
-
- CGContextAddEllipseInRect(con, CGRectMake(,,,));
-
- CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);
-
- CGContextFillPath(con);
-
- }
第三种绘图形式:我将在UIView子类的drawLayer:inContext:方法中实现绘图任务。drawLayer:inContext:方法是一个绘制图层内容的代理方法。为了能够调用drawLayer:inContext:方法,我们需要设定图层的代理对象。但要注意,不应该将UIView对象设置为显示层的委托对象,这是因为UIView对象已经是隐式层的代理对象,再将它设置为另一个层的委托对象就会出问题。轻量级的做法是:编写负责绘图形的代理类。在MyView.h文件中声明如下代码:
- @interface MyLayerDelegate : NSObject
-
- @end
然后MyView.m文件中实现接口代码:
- @implementation MyLayerDelegate
-
- - (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx {
-
- UIGraphicsPushContext(ctx);
-
- UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(,,,)];
-
- [[UIColor blueColor] setFill];
-
- [p fill];
-
- UIGraphicsPopContext();
-
- }
-
- @end
- @interface MyView () {
-
- MyLayerDelegate* _layerDeleagete;
-
- }
-
- @end
- MyView *myView = [[MyView alloc] initWithFrame: CGRectMake(, , , )];
-
- CALayer *myLayer = [CALayer layer];
-
- _layerDelegate = [[MyLayerDelegate alloc] init];
-
- myLayer.delegate = _layerDelegate;
-
- [myView.layer addSublayer:myLayer];
-
- [myView setNeedsDisplay]; // 调用此方法,drawLayer: inContext:方法才会被调用。
第四种绘图形式: 使用Core Graphics在drawLayer:inContext:方法中实现同样操作,代码如下:
- - (void)drawLayer:(CALayer*)lay inContext:(CGContextRef)con {
-
- CGContextAddEllipseInRect(con, CGRectMake(,,,));
-
- CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);
-
- CGContextFillPath(con);
-
- }
- UIGraphicsBeginImageContextWithOptions(CGSizeMake(,), NO, );
-
- UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(,,,)];
-
- [[UIColor blueColor] setFill];
-
- [p fill];
-
- UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
-
- UIGraphicsEndImageContext();
- UIGraphicsBeginImageContextWithOptions(CGSizeMake(,), NO, );
-
- CGContextRef con = UIGraphicsGetCurrentContext();
-
- CGContextAddEllipseInRect(con, CGRectMake(,,,));
-
- CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);
-
- CGContextFillPath(con);
-
- UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
-
- UIGraphicsEndImageContext();
UIKit和Core Graphics可以在相同的图形上下文中混合使用。在iOS 4.0之前,使用UIKit和UIGraphicsGetCurrentContext被认为是线程不安全的。而在iOS4.0以后苹果让绘图操作在第二个线程中执行解决了此问题。
iOS动画详解(一)的更多相关文章
- iOS动画详解(二)
UIImage常用的绘图操作 一个UIImage对象提供了向当前上下文绘制自身的方法.我们现在已经知道如何获取一个图片类型的上下文并将它转变成当前上下文. 平移操作:下面的代码展示了如何将UI ...
- [转] ReactNative Animated动画详解
http://web.jobbole.com/84962/ 首页 所有文章 JavaScript HTML5 CSS 基础技术 前端职场 工具资源 更多频道▼ - 导航条 - 首页 所有文章 ...
- [转]Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法
转载:http://blog.csdn.net/harvic880925/article/details/39996643 前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的 ...
- 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)
转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...
- [转]超级强大的SVG SMIL animation动画详解
超级强大的SVG SMIL animation动画详解 本文花费精力惊人,具有先驱前瞻性,转载规则以及申明见文末,当心予以追究.本文地址:http://www.zhangxinxu.com/wordp ...
- Android中的动画详解系列【4】——Activity之间切换动画
前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自定义动画,这一篇我们来看看如何将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 如 ...
- IOS SDK详解
来源:http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html?page=1#42803301 博客专栏>移动开发专栏>I ...
- Android Animation动画详解(二): 组合动画特效
前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一 ...
- iOS路由详解
本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...
随机推荐
- 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...
- Windows平台下的session0创建进程的问题与解决办法
很多博客都有记载如何在session0下创建进程的办法,也就是使用CreateProcessAsUser.但是这个要求服务的进程有SE_INCREASE_QUOTA_NAME和SE_ASSIGNPRI ...
- (组合数学3.1.2.1)POJ 2249 Binomial Showdown(排列组合公式的实现)
/* * POJ_2249.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> #i ...
- Android开发UI之手动显示和隐藏软键盘
1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...
- js模仿jquery里的几个方法next, pre, nextAll, preAll
/*siblings函数, 选取node的所有兄弟节点*/ function siblings(node){ if(node.nodeType === 1){ node.flag = true; // ...
- jquery 图片无缝切换
想要和园友分享一下学习jquery的经验.总结,更希望园友提出点建议. 第一次写,有不好的地方请多多见谅! 文笔有限,很多时候不知道怎么来描述,唉.硬伤啊!!那只好多做了,贴代码... ok,废话少说 ...
- Exel 利用模板导出方法
#region Exel导出方法 [MaxuniAuthAttribute(Roles = "sysroles")] public void OrderExport(string ...
- 【转】Android开发调试工具ADB的使用
原文网址:http://www.cnblogs.com/meil/archive/2012/05/24/2516055.html ADB(Android Debug Bridge)是Android S ...
- 【转】Please define the NDK_PROJECT_PATH variable to point to it
原文网址:http://blog.csdn.net/yuanjingjiang/article/details/34857623 Please define the NDK_PROJECT_PATH ...
- vtiger 支持 物业收费功能 微信收费
谁要?需要什么功能? 直接在下面留言,博主会整理大家的需求,形成产品,发出来.