1

我正在研究地图功能。该地图由多个 CAShapeLayers 构建而成,其中包含来自计算坐标的 CGPath。我有一个剪辑问题。看看下面的截图,阿拉斯加被严重剪裁。阿拉斯加路径的坐标超出了我的容器层的范围。实际上,如果我让我的容器层足够大,那么剪裁效果就会消失(当然)。

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

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

示例截图

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

我想知道是什么导致了问题,而不是使用解决方法。

4

1 回答 1

0

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

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

  1. 显然,设置 maskToBounds:YES 在使用时没有任何效果renderInContext,就像它对 a 的 mask 属性一样CALayer。MasksToBounds(或 clipToBounds)仅适用于子图层。
  2. 缩放位图时,请确保将整数值包含到 的 scale 参数中UIGraphicsBeginImageContextWithOptions。如果不是,图像将具有小数大小,例如 24.2323 x 34.3290。顺便说一句,该比例参数用于在 Retina 屏幕上创建惊人的细节,但它可能被误用于放大 CAShapeLayer 绘图。
  3. 当使用分数大小的图像作为背景层时,边缘会出现失真。

将图层更新为图像功能后,剪切效果消失了。这个成功了:

- (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,roundffloorf并不重要。只要你输掉分数。

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

于 2013-06-10T14:21:44.947 回答