黑马程序员技术交流社区

标题: 体会到了OC完全兼容C代码的好处 [打印本页]

作者: fantacyleo    时间: 2014-7-11 13:54
标题: 体会到了OC完全兼容C代码的好处
本帖最后由 fantacyleo 于 2014-7-11 14:10 编辑

苹果的Mac OS和iOS有许多层次,不同层次提供了不同的框架,这些框架有的是用C写的(通常是底层),有的是用OC写的(通常是比较接近开发者的上层)。由于OC代码可以与C代码混合书写,这就可以让开发者在不同层次的框架之间自由驰骋,既充分利用上层框架的高度抽象、简便易用,在需要底层才能完成的功能时又可以无缝切换到C代码调用底层API。

今天体验了一把Core Graphics这个底层C框架。李老师的零基础视频讲Foundation框架的结构体时提到过Core Graphics:那些CG开头的结构体CGPoint、CGRect等等就来自Core Graphics。如果你只是想绘制图形,那么用OC语法调UI开头的类及其方法就可以了。但如果想加阴影效果和渐变色,就需要用到Core Graphics的功能。由于OC完全兼容C,调用底层函数不需要任何特殊语法,C语言里怎么写,照搬到OC代码就行了,非常方便。


Core Graphics函数设置阴影效果,UIImage绘图:
  1. /* 绘制logo */
  2.     // 保存当前graphics context的状态
  3.     CGContextSaveGState(currentContext);
  4.     // 设置阴影效果
  5.     CGContextSetShadow(currentContext, // 当前context
  6.                        CGSizeMake(4, 7), // 阴影的size
  7.                        3); // 模糊度,非负数
  8.    
  9.     UIImage *logo = [UIImage imageNamed:@"logo.png"];
  10.     CGRect logoFrame = CGRectMake(bounds.size.width / 4,
  11.                                   bounds.size.height / 4,
  12.                                   bounds.size.width / 2,
  13.                                   bounds.size.height / 2);
  14.     [logo drawInRect:logoFrame];
  15.    
  16.     // 恢复之前的graphics context
  17.     CGContextRestoreGState(currentContext);
复制代码




UIBezier自定义渐变色显示范围,Core Graphics函数设置渐变色效果
  1. // 渐变色
  2.     // 3色渐变
  3.     CGFloat components[12] = {1.0, 0.0, 0.0, 1.0,
  4.                              0.0, 1.0, 0.0, 1.0,
  5.                              1.0, 1.0, 0.0, 1.0};
  6.     CGFloat locations[3] = {0.333, 0.667, 1.0};
  7.    
  8.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  9.     /*
  10.      * locations: 每种颜色在渐变轴上的相对位置
  11.      * 2: locations参数提供了几个location
  12.      */
  13.     CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace,
  14.                                                                  components,
  15.                                                                  locations,
  16.                                                                  3);
  17.    
  18.     // 定义渐变轴(根据startPoint和endPoint的连线决定渐变延伸的方向)
  19.     CGPoint startPoint = CGPointMake(bounds.size.width / 4,
  20.                                      bounds.size.height / 4);
  21.     CGPoint endPoint = CGPointMake(bounds.size.width / 4,
  22.                                    bounds.size.height * 0.75);
  23.    

  24.     // 保存当前graphics context的状态
  25.     CGContextSaveGState(currentContext);
  26.     // 创建一个三角形路径
  27.     UIBezierPath *trianglePath = [[UIBezierPath alloc] init];
  28.     [trianglePath moveToPoint:CGPointMake(bounds.size.width / 2,
  29.                                           bounds.size.height / 4)];
  30.     [trianglePath addLineToPoint:CGPointMake(bounds.size.width / 4,
  31.                                              bounds.size.height * 0.75)];
  32.     [trianglePath addLineToPoint:CGPointMake(bounds.size.width * 0.75,
  33.                                              bounds.size.height * 0.75)];
  34.     [trianglePath addClip];
  35.    
  36.    
  37.     CGContextDrawLinearGradient(currentContext,
  38.                                 gradient,
  39.                                 startPoint,
  40.                                 endPoint, 0);
  41.     // 释放内存
  42.     CGColorSpaceRelease(colorSpace);
  43.     CGGradientRelease(gradient);
复制代码


效果图:
阴影:

渐变

作者: justin1258    时间: 2014-8-7 09:55
你还学IOS?
作者: fantacyleo    时间: 2014-8-7 10:29
justin1258 发表于 2014-8-7 09:55
你还学IOS?

:victory::victory::victory::lol
作者: justin1258    时间: 2014-8-7 10:32
fantacyleo 发表于 2014-8-7 10:29

那你报了42期的android?
作者: fantacyleo    时间: 2014-8-7 10:35
justin1258 发表于 2014-8-7 10:32
那你报了42期的android?

没有,我还在考虑到底报java还是ios
作者: justin1258    时间: 2014-8-7 10:41
fantacyleo 发表于 2014-8-7 10:35
没有,我还在考虑到底报java还是ios

你学编程多久了?报42期或许我们会成为同学
作者: fantacyleo    时间: 2014-8-7 10:46
justin1258 发表于 2014-8-7 10:41
你学编程多久了?报42期或许我们会成为同学

好多年了吧,不过一直是业余状态,和我的专业几乎没啥关系。42我时间安排不过来,赶不上了,太遗憾啦:lol
作者: justin1258    时间: 2014-8-7 10:48
fantacyleo 发表于 2014-8-7 10:46
好多年了吧,不过一直是业余状态,和我的专业几乎没啥关系。42我时间安排不过来,赶不上了,太遗憾啦 ...

那你工作了没?
作者: fantacyleo    时间: 2014-8-7 10:54
justin1258 发表于 2014-8-7 10:48
那你工作了没?

没,还是学生
作者: 尼古拉斯码农    时间: 2015-7-26 15:53
fantacyleo 发表于 2014-8-7 10:54
没,还是学生

楼主后来怎么样,上了吗




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2