找到CALayer的边界框以绘制图形上下文

时间:2014-07-04 10:32:02

标签: ios core-graphics core-animation

我有一个CALayer个子图层。 clipsToBoundsNO(默认)。我想将CALayer(包括所有子图层)的完整内容绘制到图像上下文中。为此我需要确定上下文需要多大。在CALayer上是否有方法可以检索图形上下文所需的大小,以便适合所有内容? (也就是超出图层范围的内容)

2 个答案:

答案 0 :(得分:3)

您可以将边界框计算为图层及其所有子图层的并集。

CGRect boundingBox = myLayer.bounds;
for (CALayer *sublayer in myLayer.sublayers) {
    boundingBox = CGRectUnion(boundingBox, sublayer.frame);
}

这可行,因为CGRectUnion返回:

  

完全包含两个源矩形的最小矩形。

因此,通过对边界框和每个图层进行并集,您得到一个矩形是最小的矩形,它完全包含所有子图层(以及图层本身)。


请注意,bounds用于图层本身,而frame用于子图层。这是因为边界在图层自己的坐标系中,而框架在父坐标系中。这意味着子图层上的框架位于myLayer的坐标系中。

另请注意,这不是一个递归解决方案,因此如果子图层的子图层超出其边界范围,那么此解决方案将不会考虑到这一点。

答案 1 :(得分:1)

不 - 图形上下文没有大小,所以没有这样的方法。你必须自己做。 您需要迭代所有子图层并找到所有子图层。宽度/高度的最小值;

你需要这样的东西:

CGRect layerRect = [self layer].frame;

CGFloat minX = CGRectGetMinX(layerRect);
CGFloat maxX = CGRectGetMaxX(layerRect);
CGFloat minY = CGRectGetMinY(layerRect);
CGFloat maxY = CGRectGetMaxY(layerRect);

for(CALayer *sublayer in [[self layer] sublayers])
{
    CGRect sublayerRect = sublayer.frame;

    minX = MIN(minX, CGRectGetMinX(sublayerRect));
    maxX = MAX(maxX, CGRectGetMaxX(sublayerRect));

    minY = MIN(minY, CGRectGetMinY(sublayerRect));
    maxY = MAX(maxY, CGRectGetMinY(sublayerRect));
}

CGSize imageSize = (CGSize){maxX - minX, maxY - minY};