iOS开发CoreGraphics核心图形框架之五——Patterns模型的应用

简介: iOS开发CoreGraphics核心图形框架之五——Patterns模型的应用

一、引言


   Patterns称为模型可能并不直观,说一个场景我们或许就可以更加容易的理解Patterns。在开发中,开发者经常会遇到这样的需求,将某个图片或者某个图形进行平铺作为界面的背景,当然iOS中有现成的方法来将图片转换为背景色进行背景的渲染,但是这种方式并不太灵活,例如背景花纹的着色,背景图片的平铺间距设置等需求都无法满足。Patterns就是用来处理这样的需求。


   Patterns可以理解为一个模型单元,即花纹背景中的一个花纹单元,开发者可以自定义这个单元的绘制内容,一旦创建了CGPatternRef引用,开发者就可以将它向普通颜色一样进行使用,可以进行填充,可以进行路径绘制等。


二、创建CGPatternRef模型引用


   在UIView子类的drawRect:方法中来做如下的测试:


- (void)drawRect:(CGRect)rect {

   // Drawing code

   //创建回调结构体 后面会介绍

   CGPatternCallbacks callback = {0,&drawPatternCallback,&releaseInfoCallback};

   //创建模型引用

   CGPatternRef pattren = CGPatternCreate(NULL, CGRectMake(0, 0, 30,30), CGAffineTransformIdentity, 35, 35, kCGPatternTilingConstantSpacing, false, &callback);

   //创建颜色数组 代表RGBA的值

   static const CGFloat color[4] = { 0, 1, 0, 1 };

   //创建颜色空间

   CGColorSpaceRef baseSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB);

   CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern (baseSpace);

   //设置填充颜色空间

   CGContextSetFillColorSpace (UIGraphicsGetCurrentContext(), patternSpace);

   //设置填充模型

   CGContextSetFillPattern(UIGraphicsGetCurrentContext(), pattren, color);

   //进行填充

   CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, 200, 200));

 

}

上面的示例代码中,有几个地方需要进行介绍:


CGPatternCallBacks是CoreGraphics框架的CGPattern.h文件中定义的一个结构体,这个结构体组合了模型Pattern的版本,创建回调和释放回调。创建回调和释放回调需要传入两个方法块的地址,即block。这两个block的格式定义如下:


//创建模型回调的格式定义

//info参数为需要传递给回调函数的数据

//content参数为所绘制的图形上下文

typedef void (*CGPatternDrawPatternCallback)(void * __nullable info,

                                            CGContextRef cg_nullable context);

//释放回调 开发者可以在其中进行内存的释放

typedef void (*CGPatternReleaseInfoCallback)(void * __nullable info);

我们所实现的drawPatternCallback(),releaseInfoCallback()方法示例如下:


// 绘制 回调

#define PSIZE 16

void drawPatternCallback(void *info,CGContextRef myContext){

//这里我借用了官方文档中的代码 如下的代码将绘制出五角星

   int k;

   double r, theta;

 

   r = 0.8 * PSIZE / 2;

   theta = 2 * M_PI * (2.0 / 5.0); // 144 degrees

 

   CGContextTranslateCTM (myContext, PSIZE/2, PSIZE/2);

 

   CGContextMoveToPoint(myContext, 0, r);

   for (k = 1; k < 5; k++) {

       CGContextAddLineToPoint (myContext,

                                r * sin(k * theta),

                                r * cos(k * theta));

   }

   CGContextClosePath(myContext);

   CGContextFillPath(myContext);

}



// 移除 回调

void releaseInfoCallback(void *info) {

 

}

在回过来看创建CGPatternRef的方法:


/*

这个方法

第1个参数为要传递进创建模型方法的信息

第2个参数为设置每个模型单元的尺寸

第3个参数设置模型的几何变换

第4个参数设置模型的整体宽度  通过这个参数可以设置边距

第5个参数设置模型的整体高度  通过这个参数可以设置边距

第6个参数设置模型的渲染方式

第7个参数设置为有色渲染还是无色渲染

第8个参数设置相关回调结构体

*/

CGPatternRef pattren = CGPatternCreate(NULL, CGRectMake(0, 0, 30,30), CGAffineTransformIdentity, 35, 35, kCGPatternTilingConstantSpacing, false, &callback);

关于模型的渲染方式,需要设置为CGPatternTiling类型的枚举,如下:


typedef CF_ENUM (int32_t, CGPatternTiling) {

   //无失真的平铺 将调整单元之间的间距

   kCGPatternTilingNoDistortion,

   //细微调整单元大小

   kCGPatternTilingConstantSpacingMinimalDistortion,

   //恒定间距,通过调整单元大小实现 会失真

   kCGPatternTilingConstantSpacing

};

CGContextSetFillPattern()方法用于将模型设置为要渲染界面的颜料,之后调用CGContextStrokePath(), CGContextFillPath(), CGContextFillRect()等相关方法都可以实现将模型铺平渲染到指定容器。需要注意,CGContextSetFillPattern()方法中第1个参数为绘图上下文,第2个参数为模型CGPatternRef引用,第3个参数为一个色值数组,这里如果模式是无色渲染方式创建的,需要传入4个元素的RGBA数组,如果是有色模式创建的,需要传入一个透明度值,可以是float类型的指针。


运行工程,效果如下图所示:


image.png


将代码简单修改如下,就可以实现以五角星围成的矩形:


- (void)drawRect:(CGRect)rect {

   // Drawing code

   CGPatternCallbacks callback = {0,&drawPatternCallback,&releaseInfoCallback};

   CGPatternRef pattren = CGPatternCreate(NULL, CGRectMake(0, 0, 30,30), CGAffineTransformIdentity, 30, 30, kCGPatternTilingConstantSpacing, false, &callback);

   static const CGFloat color[4] = { 1, 0, 0, 1 };

   CGColorSpaceRef baseSpace;

   CGColorSpaceRef patternSpace;

   baseSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB);

   patternSpace = CGColorSpaceCreatePattern (baseSpace);

   CGContextSetStrokeColorSpace (UIGraphicsGetCurrentContext(), patternSpace);

   CGContextSetStrokePattern(UIGraphicsGetCurrentContext(), pattren, color);

   CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 40);

   CGContextStrokeRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, 200, 200));

}

效果如下:


image.png


三、CGPattern中其他方法


//获取CGPattern在CoreGraphics框架中的id

CFTypeID CGPatternGetTypeID(void);

//进行引用计数加1

CGPatternRef cg_nullable CGPatternRetain(CGPatternRef cg_nullable pattern);

//进行引用计数减1

void CGPatternRelease(CGPatternRef cg_nullable pattern);

目录
相关文章
|
4天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
143 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
90 11
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
143 66
|
iOS开发
iOS开发之ExternalAccessory框架的应用
iOS开发之ExternalAccessory框架的应用
600 0
|
iOS开发
iOS开发之EventKitUI框架的应用
iOS开发之EventKitUI框架的应用
317 0
|
定位技术 iOS开发
iOS开发之EventKit框架的应用(三)
iOS开发之EventKit框架的应用
762 0
|
存储 iOS开发 开发者
iOS开发之EventKit框架的应用(二)
iOS开发之EventKit框架的应用
899 0
|
存储 iOS开发
iOS开发之EventKit框架的应用(一)
iOS开发之EventKit框架的应用
804 0
iOS开发之EventKit框架的应用(一)
|
开发者 iOS开发
iOS开发之DeviceCheck框架的应用
iOS开发之DeviceCheck框架的应用
805 0
iOS开发之DeviceCheck框架的应用

热门文章

最新文章

  • 1
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    24
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    33
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 5
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    143
  • 6
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    234
  • 7
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    90
  • 8
    深入探索iOS开发中的SwiftUI框架
    143
  • 9
    ios样式开关按钮jQuery插件
    58
  • 10
    Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
    75