【发布时间】:2013-04-03 19:23:44
【问题描述】:
我想使用几个 CALayer 作为 UIViewController 的子层。 第一个是背景。
其他人都在这个背景前面。
如何组合/绘制带有孔/透明点的图像 并将其绘制在 CALayer 中,这样背景仍然可见。
我不想为每个图像使用一个 CALayer,我最终会得到 20 000 个 CALayer 或更多...
那么如何在 CALayer 中将图像的“图像”放在一起? (然后用作子层)
代码示例:
// rootView which is a UIViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_sproutLayer = [[CGSproutLayer alloc] initWithLayer:[CALayer layer]];
[self.view.layer addSublayer:_sproutLayer];
[_sproutLayer setZPosition:1];
[_sproutLayer setNeedsDisplay];
_backgroundLayer = [[CALayer alloc] init];
CGRect positionOne = CGRectMake(100, 100, 150, 150);
_backgroundLayer.frame = positionOne;
_backgroundLayer.backgroundColor = [UIColor blueColor].CGColor;
_backgroundLayer.name = @"One";
_backgroundLayer.contents = (id) [UIImage imageNamed:@"background.png"].CGImage;
[self.view.layer addSublayer:_backgroundLayer];
[_backgroundLayer setZPosition:0];
[_backgroundLayer setNeedsDisplay];
_refreshTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(doIterate:) userInfo:nil repeats:YES];
}
- (void)doIterate:(NSTimer *)timer
{
[self.something doComputeStuff];
...
[_sproutLayer draw];
}
// CGSproutLayer which is a CALAyer
- (void)draw
{
int cellSize = self.bounds.size.width / WIDTH;
double xOffset = 0;
CGRect cellFrame = CGRectMake(0, 0, cellSize, cellSize);
NSUInteger cellIndex = 0;
cellFrame.origin.x = xOffset;
for (int i = 0; i < WIDTH; i++)
{
cellFrame.origin.y = 0;
for (int j = 0; j < HEIGHT; j++, cellIndex++)
{
NSNumber *currentCell = [self.levelState.board objectAtIndex:cellIndex];
if (currentCell.intValue == sprouts)
{
[image1 drawInRect:cellFrame];
}
else if (currentCell.intValue == grass)
{
[image2 drawInRect:cellFrame];
}
cellFrame.origin.y += cellSize;
}
cellFrame.origin.x += cellSize;
}
}
【问题讨论】:
-
iPhone 有 960*640 像素,总共约 600000 像素。也就是每层大约 30 个像素。我们仍在谈论像素,因此点数将是其四分之一(7 或 8 点)。例如,屏幕上的 2x4 点。没有那么小的东西是有用的。 您可以同时在屏幕上使用这么多图层做什么?
-
这就是为什么我说我不想使用 20 000 CALayers。我换种说法:如果我有一个头骨作为背景,我如何在它上面画头发。我可以重复使用一个类似于头发的 CALayer,或者以某种方式将一个透明的大头发图像放在一起,这样我仍然可以看到头骨。但是如何做到这一点呢?
-
您需要将所有图像绘制到一个单独的上下文中,然后从该上下文创建一个混合的 UIImage。有关示例,请参阅this 帖子。注意:如果您希望使用主上下文,您必须在
DrawRect()内拨打电话
标签: iphone objective-c xcode