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;

使用ceilfroundffloorf 并不重要。只要你输掉分数。

对不起,如果我的愚蠢浪费了您的任何时间,但也许其他人也有同样的问题。

【讨论】:

以上是关于CAShapeLayer 恼人的剪裁错误的主要内容,如果未能解决你的问题,请参考以下文章

停止恼人的IE背景图像闪烁错误

什么是“StringQueryOperatorInput”类型?我怎样才能摆脱这个恼人的 graphql 错误?

需要帮助 w/ 恼人的 Makefile 错误 -- g++: g++ 和 shell 错误 -- 和 Multi-Makefile 设计建议

当我在文本框中按 Enter 键时发出恼人的哔哔声

从 DbValidationException 获取准确的错误类型

Django SECRET KEY 错误