在 CALayer 中为 UIImages 分配自己的 Rect 的机制?

Posted

技术标签:

【中文标题】在 CALayer 中为 UIImages 分配自己的 Rect 的机制?【英文标题】:Mechanism to assign UIImages their own Rect inside a CALayer? 【发布时间】:2013-03-17 11:46:39 【问题描述】:

我有一个或多个代表/填充整个屏幕的 CALayers。 我想从网格结构中填充那些 CALayers,使用很多带有图像的小矩形。

我尝试为每个 Rect 分配自己的 CALayer 和 UIImage。 使用超过 6000 个 CALayers,结果非常缓慢。现在我正在寻找一种不使用那么多 CALayer 的方法。也许只有***的。

那么是否有一种机制可以在 CALayer 中为 UIImages 分配自己的 Rect ?

慢/坏代码示例:

- (void)createLayer
    CALayer *currentLayer = self.layer;

    _layerArray = [[NSMutableArray alloc] initWithCapacity:WIDTH*HEIGHT];
    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++)
                        
            if([[self.levelState.boardChanges objectAtIndex:(i*HEIGHT)+j] intValue]==1)
                
                    NSNumber *currentCell = [self.levelState.board objectAtIndex:cellIndex];
                    CALayer *sublayer = [CALayer layer];
                    sublayer.frame = cellFrame;
                    if (currentCell.intValue == 1)
                    
                        [[_layerArray objectAtIndex:(i*HEIGHT)+j ] setContents:(id) [UIImage imageNamed:@"image1.png"].CGImage];
                    
                    else if (currentCell.intValue == 0)
                    
                        [[_layerArray objectAtIndex:(i*HEIGHT)+j ] setContents:(id) [UIImage imageNamed:@"image2.png"].CGImage];
                    
                    [currentLayer addSublayer:sublayer];
                    [_layerArray addObject:sublayer];
                
            
            cellFrame.origin.y += cellSize;
        
        cellFrame.origin.x += cellSize;
    

【问题讨论】:

【参考方案1】:

我会推荐一种非常不同的方法。

子类化 uiview 并将其用作背景

在你的 uiview 子类中,覆盖

-(void)drawRect:(CGRect)rect

在里面,你可以在你定义的矩形内绘制你的 uiimages

[[UIImage imageNamed:@"image1.png"]drawInRect:CGRectMake(0,0,10,10)]; //first square
[[UIImage imageNamed:@"image2.png"]drawInRect:CGRectMake(10,0,10,10)]; // and another right beside it

您可以更多地研究核心图形以获得更好的想法

【讨论】:

这很好用。但是,CPU 与 GPU 存在速度问题。我希望通过使用 CALayers 和 GPU 来加快速度。请参阅:***.com/questions/15312792/… 是否必须重绘所有单元格?如果您只重绘一些单元格(那些已更改的单元格),您可以获得明显更好的速度

以上是关于在 CALayer 中为 UIImages 分配自己的 Rect 的机制?的主要内容,如果未能解决你的问题,请参考以下文章

CALayer 在视图中未正确定位

在哪里调用 setNeedsDisplay 来更新 CALayer?

在自定义方法中为数组中的元素分配最小值 (array.Min())

如何在运行时正确压缩 UIImages

通过UIStackView在同等大小的UIImages下安排自定义大小的UILabels

从 CALayer 掩码中清除?