10

我想在 CALayer 上平铺 CGImage,但它似乎只想拉伸它。

示例代码:

 self.background = [UIImage imageNamed: @"Background.png"];
 [documentDisplay.layer setContents: self.background.CGImage];

如果可以的话,我想避免子类化。

4

4 回答 4

13

您可以使用图案图像创建颜色并将其设置为图层的背景颜色。

为此,您需要将您CGImage的 a包裹起来CGPattern并从中制作 a CGColor

// callback for CreateImagePattern.
static void drawPatternImage (void *info, CGContextRef ctx)
{
    CGImageRef image = (CGImageRef) info;
    CGContextDrawImage(ctx, 
                       CGRectMake(0,0, CGImageGetWidth(image),CGImageGetHeight(image)),
                       image);
}

// callback for CreateImagePattern.
static void releasePatternImage( void *info )
{
    CGImageRelease((CGImageRef)info);
}

//assume image is the CGImage you want to assign as the layer background
int width = CGImageGetWidth(image);
int height = CGImageGetHeight(image);
static const CGPatternCallbacks callbacks = {0, &drawPatternImage, &releasePatternImage};
CGPatternRef pattern = CGPatternCreate (image,
                        CGRectMake (0, 0, width, height),
                        CGAffineTransformMake (1, 0, 0, 1, 0, 0),
                        width,
                        height,
                        kCGPatternTilingConstantSpacing,
                        true,
                        &callbacks);
CGColorSpaceRef space = CGColorSpaceCreatePattern(NULL);
CGFloat components[1] = {1.0};
CGColorRef color = CGColorCreateWithPattern(space, pattern, components);
CGColorSpaceRelease(space);
CGPatternRelease(pattern);
yourLayer.backgroundColor = color; //set your layer's background to the image
CGColorRelease(color);

此代码是从 GeekGameBoard 示例代码修改而来的。

于 2010-03-26T03:52:54.890 回答
10

完成此操作的最简单代码是:

CALayer *layer = [CALayer layer];
layer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background_tile"]].CGColor;
于 2013-02-05T19:23:13.740 回答
3

这个比较简单。但请注意,这是一个私有 API,使用风险自负。

设置如下

#import <QuartzCore/QuartzCore.h>

CA_EXTERN NSString * const kCAContentsScalingRepeat;

@interface CALayer (CALayerAdditions)
@property(copy) NSString *contentsScaling;
@end

然后就这样做

[myLayer setContentsScaling:kCAContentsScalingRepeat];
于 2012-07-01T06:37:00.190 回答
0

您可以为此使用 CGContextDrawTiledImage 方法

于 2011-05-21T12:14:24.427 回答