-1

UIViewController のサブレイヤーとして複数の CALayer を使用したいと考えています。一枚目は背景です。

他の人はこの背景の前にいます。

穴/透明なスポットを含む画像をまとめて描画し、それを 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;
    }
}
4

1 に答える 1

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

ありがとうございます!

于 2013-04-04T11:46:59.703 に答える