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