CAShapeLayer 恼人的剪裁错误
Posted
技术标签:
【中文标题】CAShapeLayer 恼人的剪裁错误【英文标题】:CAShapeLayer annoying clipping error 【发布时间】:2013-06-05 23:04:47 【问题描述】:我正在开发地图功能。该地图由多个 CAShapeLayer 构建而成,其中包含来自计算坐标的 CGPath。我有一个剪辑问题。看看下面的截图,阿拉斯加被严重剪裁。阿拉斯加路径的坐标超出了我的容器层的范围。实际上,如果我让我的容器层足够大,那么剪裁效果就消失了(当然)。
您会看到一条黑线,因为阿拉斯加的底部从左到右是实心的。此外,这条线比地图的其他部分更暗,因为地图具有不透明度(因为叠加而变得更暗)。
我深入研究了问题,并将其缩小到单个大多边形(没有其他多边形会导致剪裁错误)。
作为一种解决方法,我将图层变大以隐藏线条,然后将 UIView 再次变小以隐藏线条。
我想知道是什么导致了问题,而不是想办法解决问题。
【问题讨论】:
【参考方案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
并不重要。只要你输掉分数。
对不起,如果我的愚蠢浪费了您的任何时间,但也许其他人也有同样的问题。
【讨论】:
以上是关于CAShapeLayer 恼人的剪裁错误的主要内容,如果未能解决你的问题,请参考以下文章
什么是“StringQueryOperatorInput”类型?我怎样才能摆脱这个恼人的 graphql 错误?
需要帮助 w/ 恼人的 Makefile 错误 -- g++: g++ 和 shell 错误 -- 和 Multi-Makefile 设计建议