【问题标题】:CAShapeLayer annoying clipping errorCAShapeLayer 恼人的剪裁错误
【发布时间】:2013-06-05 23:04:47
【问题描述】:
我正在开发地图功能。该地图由多个 CAShapeLayer 构建而成,其中包含来自计算坐标的 CGPath。我有一个剪辑问题。看看下面的截图,阿拉斯加被严重剪裁。阿拉斯加路径的坐标超出了我的容器层的范围。实际上,如果我让我的容器层足够大,那么剪裁效果就消失了(当然)。
您会看到一条黑线,因为阿拉斯加的底部从左到右是实心的。此外,这条线比地图的其他部分更暗,因为地图具有不透明度(因为叠加而变得更暗)。
我深入研究了问题,并将其缩小到单个大多边形(没有其他多边形会导致剪裁错误)。
作为一种解决方法,我将图层变大以隐藏线条,然后将 UIView 再次变小以隐藏线条。
我想知道是什么导致了问题,而不是想办法解决问题。
【问题讨论】:
标签:
iphone
ios
core-graphics
layer
clipping
【解决方案1】:
经过大量挖掘,我设法找到了自己问题的答案。
我将图层渲染到 UIImage 以提高性能。背景层被 UIScrollView 放大了,然后出现了一些问题:
- 显然,在使用
renderInContext 时设置 maskToBounds:YES 没有任何效果,就像使用 CALayer 的 mask 属性一样。 MasksToBounds(或 clipToBounds)仅适用于子图层。
- 当缩放位图时,请确保在
UIGraphicsBeginImageContextWithOptions 的缩放参数中包含整数值。如果没有,图像将具有小数大小,例如24.2323 x 34.3290。顺便说一句,该比例参数用于在 Retina 屏幕上创建惊人的细节,但它可能被误用于放大 CAShapeLayer 绘图。
- 使用小数尺寸图像作为背景层时,边缘会出现失真。
在我将图层更新为图像功能后,剪辑效果消失了。这个成功了:
- (UIImage *)getImageWithSize:(CGSize)size opaque:(bool)opaque contentScale:(CGFloat)scale
{
CGContextRef context;
size = CGSizeMake(ceilf(size.width), ceilf(size.height));
scale = roundf(scale);
UIGraphicsBeginImageContextWithOptions(size, opaque, scale);
context = UIGraphicsGetCurrentContext();
[self renderInContext:context];
UIImage *outputImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImg;
}
使用ceilf、roundf 或floorf 并不重要。只要你输掉分数。
对不起,如果我的愚蠢浪费了您的任何时间,但也许其他人也有同样的问题。