【CoreGraphics】CGPattern - 模式填充

模式填充,类似瓷砖效果;

创建

  • 设置回调
// 绘制 回调
void drawPatternCallback(void *info, CGContextRef context) {
    //有颜色填充,这里设置填充色
    CGContextFillRect(context, CGRectMake(0, 0, TILE_SIZE, TILE_SIZE));// 需要填充颜色的 位置
    CGContextFillRect(context, CGRectMake(TILE_SIZE, TILE_SIZE, TILE_SIZE, TILE_SIZE));// 同上
}

// 移除 回调
void releaseInfoCallback(void *info) {
    // 一般 传  NULL
}

  • 设置模式
    //填充模式回调函数结构体
    CGPatternCallbacks callback={0,&drawPatternCallback, &releaseInfoCallback};

    /*填充模式
     info://传递给callback的参数
     bounds:瓷砖大小
     matrix:形变
     xStep:瓷砖横向间距
     yStep:瓷砖纵向间距
     tiling:贴砖的方法(瓷砖摆放的方式)
     isClored:绘制的瓷砖是否已经指定了颜色(对于无颜色瓷砖此处指定位false)
     callbacks:回调函数
     */
    CGPatternRef pattern=CGPatternCreate(NULL,
                                         CGRectMake(0, 0, 2*TILE_SIZE, 2*TILE_SIZE),
                                         CGAffineTransformIdentity,
                                         2*TILE_SIZE+ 5,
                                         2*TILE_SIZE+ 5,
                                         kCGPatternTilingNoDistortion,
                                         false,
                                         &callback);
/*
typedef CF_ENUM (int32_t, CGPatternTiling) {
    kCGPatternTilingNoDistortion,
    kCGPatternTilingConstantSpacingMinimalDistortion,
    kCGPatternTilingConstantSpacing
};
*/

操作

CG_EXTERN CGPatternRef __nullable CGPatternRetain(CGPatternRef __nullable pattern)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

CG_EXTERN void CGPatternRelease(CGPatternRef __nullable pattern)
    CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

实际使用

结合 Context 绘制,区分有色填充与无色填充(感觉没有大差别)

  • 1 有色填充
#pragma mark - 有颜色填充模式

// 绘制 回调
void drawPatternCallback(void *info,CGContextRef context){
    //有颜色填充,这里设置填充色
    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);// 设置填充颜色
    CGContextFillRect(context, CGRectMake(0, 0, TILE_SIZE, TILE_SIZE));// 设置填充位置
    CGContextFillRect(context, CGRectMake(TILE_SIZE, TILE_SIZE, TILE_SIZE, TILE_SIZE));// 同上
}

// 移除 回调
void releaseInfoCallback(void *info) {
    // 一般 传  NULL
}

// 传入 context 绘制
-(void)drawBackgroundWithColoredPattern:(CGContextRef)context{
 
    //模式填充颜色空间,注意对于有颜色填充模式,这里传NULL
    CGColorSpaceRef colorSpace = CGColorSpaceCreatePattern(NULL);
    
    //将填充色颜色空间设置为模式填充的颜色空间
    CGContextSetFillColorSpace(context, colorSpace);
    
    //填充模式回调函数结构体
    CGPatternCallbacks callback={0, &drawPatternCallback, &releaseInfoCallback};
    
    /*填充模式
     info://传递给callback的参数
     bounds:瓷砖大小
     matrix:形变
     xStep:瓷砖横向间距
     yStep:瓷砖纵向间距
     tiling:贴砖的方法
     isClored:绘制的瓷砖是否已经指定了颜色(对于有颜色瓷砖此处指定位true)
     callbacks:回调函数
     */
    CGPatternRef pattern = CGPatternCreate(NULL,
                                           CGRectMake(0, 0, 2 * TILE_SIZE, 2 * TILE_SIZE),
                                           CGAffineTransformIdentity,
                                           2 * TILE_SIZE,
                                           2 * TILE_SIZE,
                                           kCGPatternTilingNoDistortion,
                                           true,
                                           &callback);
    
    CGFloat alpha=1;
    //注意最后一个参数对于有颜色瓷砖指定为透明度的参数地址,对于无颜色瓷砖则指定当前颜色空间对应的颜色数组
    CGContextSetFillPattern(context, pattern, &alpha);
 
 // 绘制大小    
    UIRectFill(CGRectMake(0, 0, 60, 60));
    
 // 移除
    CGColorSpaceRelease(colorSpace);
    CGPatternRelease(pattern);
}

  • 2 无色填充
#pragma mark - 无颜色填充模式

// 绘制 回调
void drawPatternCallback(void *info, CGContextRef context) {
 // 因为是无色填充,这里只能设置后续填充的位置
    CGContextFillRect(context, CGRectMake(0, 0, TILE_SIZE, TILE_SIZE));// 需要填充颜色的 位置
    CGContextFillRect(context, CGRectMake(TILE_SIZE, TILE_SIZE, TILE_SIZE, TILE_SIZE));// 同上
}

// 移除 回调
void releaseInfoCallback(void *info) {
    // 一般 传  NULL
}

-(void)drawBackgroundWithPattern:(CGContextRef)context{

    //设备无关的颜色空间(就是后面用于填充的颜色空间)
    CGColorSpaceRef rgbSpace= CGColorSpaceCreateDeviceRGB();

    //模式填充颜色空间
    CGColorSpaceRef colorSpace=CGColorSpaceCreatePattern(rgbSpace);

    //将填充色颜色空间设置为模式填充的颜色空间
    CGContextSetFillColorSpace(context, colorSpace);
    
    //填充模式回调函数结构体
    CGPatternCallbacks callback={0, &drawPatternCallback, &releaseInfoCallback};
    /*填充模式
     info://传递给callback的参数
     bounds:瓷砖大小
     matrix:形变
     xStep:瓷砖横向间距
     yStep:瓷砖纵向间距
     tiling:贴砖的方法(瓷砖摆放的方式)
     isClored:绘制的瓷砖是否已经指定了颜色(对于无颜色瓷砖此处指定位false)
     callbacks:回调函数
     */
    CGPatternRef pattern=CGPatternCreate(NULL,
                                         CGRectMake(0, 0, 2 * TILE_SIZE, 2 * TILE_SIZE),
                                         CGAffineTransformIdentity,
                                         2 * TILE_SIZE,
                                         2 * TILE_SIZE,
                                         kCGPatternTilingNoDistortion,
                                         false,
                                         &callback);
    
    CGFloat components[]={1.0, 0.0, 0.0, 1.0};
    //注意最后一个参数对于无颜色填充模式指定为当前颜色空间颜色数据
    CGContextSetFillPattern(context, pattern, components);
    
 // 绘制大小
    UIRectFill(CGRectMake(0, 0, 60, 60));
    
 // 移除
    CGColorSpaceRelease(rgbSpace);
    CGColorSpaceRelease(colorSpace);
    CGPatternRelease(pattern);
 }

1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,708评论 2 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,400评论 25 707
  • 模式是重复绘制到图形上下文的绘制操作序列。 您可以使用与使用颜色相同的方式使用模式。 当使用模式绘制时,Quart...
    权宜平和阅读 614评论 0 0
  • 在我还是厨房新兵时,需要上甜点的场合会选择做份提拉米苏。因为实在是讨巧,好味,不容易失败。 提拉米苏算普及度很高的...
    鹿西最喜欢阅读 3,577评论 14 76
  • 闪电跑在雷声前面 只当是夜的寻常 雷声乍起锋芒 惊起饮水的鱼 时间跑在回忆的前面 只当是信的寻常 回忆渐张密网 拦...
    饮水言他阅读 121评论 0 0