CAShapeLayer恼人的剪辑错误

时间:2013-06-10 10:08:15

标签: iphone ios core-graphics layer clipping

我正在研究地图功能。地图由多个CAShapeLayers构建而成,其中CGPath来自计算坐标。我有剪辑问题。请看下面的截图,其中阿拉斯加被严重削减。阿拉斯加路径的坐标超出了我的容器层的边界。实际上,如果我使我的容器层足够大,剪切效果就消失了(当然)。

你看到一条黑线,因为在阿拉斯加的底部是从左到右的固体。此外,线条比地图的其他部分更暗,因为地图具有不透明度(因为它会加起来变得更暗)。

我深入研究了问题,并将其缩小为单个大多边形(没有其他多边形负责剪切错误)。

Sample screenshot

作为一种解决方法,我将图层放大以隐藏线条,然后再次缩小UIView以隐藏线条。

我想知道造成问题的原因,而不是使用变通方法。

1 个答案:

答案 0 :(得分:0)

经过大量的挖掘,我设法找到了自己问题的答案。

我将图层渲染为UIImage以提高性能。背景图层由UIScrollView放大,然后出现了一些问题:

  1. 显然,设置masksToBounds:YES在使用renderInContext时无效,就像使用CALayer的mask属性一样。 MasksToBounds(或clipToBounds)仅适用于子层。
  2. 缩放位图时,请务必在UIGraphicsBeginImageContextWithOptions的scale参数中包含整数值。如果不是,则图像将具有分数大小,例如, 24.2323 x 34.3290。顺便说一下,这个比例参数用于在Retina屏幕上创建惊人的细节,但它可能被误用来放大CAShapeLayer图纸。
  3. 当使用分数大小的图像作为背景图层时,边缘会出现扭曲。
  4. 我将图层更新为图像功能后剪辑效果消失了。这个做了诀窍:

    - (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并不重要。只要你失去分数。

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