【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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容