【问题标题】:How to put together an "image" of images in a CALayer?如何在 CALayer 中将图像的“图像”放在一起?
【发布时间】: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


【解决方案1】:

我像 sethHB 建议的那样解决了它: 对于我上面建议的图像数量,此解决方案非常快速且足够。

- (void)draw 
{
    CGSize size = self.view.frame.size;
    UIGraphicsBeginImageContext(size);

    CGRect cellFrame = CGRectMake(0, 0, cellSize, cellSize);

    for (int i = 0; i < WIDTH; i++)
    {
        cellFrame.origin.y = 0;
        for (int j = 0; j < HEIGHT; j++, cellIndex++)
        {
                CGPoint pp = CGPointMake(i, j);
                if (currentCell.intValue == sprouts)
                {
                    [image1 drawAtPoint:pp blendMode:kCGBlendModeOverlay alpha:1.0];                 
                }
                else if (currentCell.intValue == grass)
                {
                    [image2 drawAtPoint:pp blendMode:kCGBlendModeOverlay alpha:1.0];                    
                } 
            }
            cellFrame.origin.y += cellSize;
        }
        cellFrame.origin.x += cellSize;
    }
    UIImage* blendedImage = UIGraphicsGetImageFromCurrentImageContext();
    _frontLayer.contents = (id) blendedImage.CGImage;
    UIGraphicsEndImageContext();
}

谢谢你!

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多