【CoreGraphics】CGPattern - 模式填充

2016-06-13  本文已影响458人  居然是村长

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

创建

// 绘制 回调
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 绘制,区分有色填充与无色填充(感觉没有大差别)

#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);
}

#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

上一篇 下一篇

猜你喜欢

热点阅读