在 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 的机制?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里调用 setNeedsDisplay 来更新 CALayer?
在自定义方法中为数组中的元素分配最小值 (array.Min())