我正在研究地图功能。地图由多个CAShapeLayers构建而成,其中CGPath来自计算坐标。我有剪辑问题。请看下面的截图,其中阿拉斯加被严重削减。阿拉斯加路径的坐标超出了我的容器层的边界。实际上,如果我使我的容器层足够大,剪切效果就消失了(当然)。
你看到一条黑线,因为在阿拉斯加的底部是从左到右的固体。此外,线条比地图的其他部分更暗,因为地图具有不透明度(因为它会加起来变得更暗)。
我深入研究了问题,并将其缩小为单个大多边形(没有其他多边形负责剪切错误)。
作为一种解决方法,我将图层放大以隐藏线条,然后再次缩小UIView以隐藏线条。
我想知道造成问题的原因,而不是使用变通方法。
答案 0 :(得分:0)
我将图层渲染为UIImage以提高性能。背景图层由UIScrollView放大,然后出现了一些问题:
renderInContext
时无效,就像使用CALayer
的mask属性一样。 MasksToBounds(或clipToBounds)仅适用于子层。UIGraphicsBeginImageContextWithOptions
的scale参数中包含整数值。如果不是,则图像将具有分数大小,例如, 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
并不重要。只要你失去分数。
对不起,如果我的愚蠢浪费你的任何时间,但也许其他人也有同样的问题。