在CALayers drawInContext中的iOS绘图在视网膜上是像素化的或模糊的

前端之家收集整理的这篇文章主要介绍了在CALayers drawInContext中的iOS绘图在视网膜上是像素化的或模糊的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个定制的UIView,画出一些被覆盖的东西
- (void)drawRect:(CGRect)rect

这样可以很好的处理视网膜屏幕.

但是,现在我想使绘图所基于的属性基于动画.创建动画属性似乎只有在CALayer上才有可能,所以我不用在UIView中做绘图,而是创建一个自定义的CALayer子类,然后在里面进行绘图

- (void) drawInContext:(CGContextRef)ctx

我在这个函数中使用了与在自定义UIView的drawRect函数中使用的完全相同的绘图代码.

结果看起来是一样的 – 但是,它不是视网膜分辨率,而是像素化(大方形像素)

如果我放

self.contentsScale = [UIScreen mainScreen].scale;

在我的drawInContext实现的开始,而不是像素化的结果,我得到一个模糊的结果(好像渲染仍然在非视网膜分辨率执行,然后放大到视网膜分辨率).

在CALayers drawInContext中渲染锐利视网膜路径的正确方法是什么?

这里有一些截图(蓝线是自定义图形的一部分,黄色部分只是一个图像)

自定义UIView的drawRect中绘制:

CALATED的drawInContext内部绘制:

定制CALayer的drawInContext中的Drawin,首先设置self.contentScale:

为了完整,这里是(一个剥离版本)的绘图代码

//if drawing inside custom UIView sublcass:
- (void)drawRect:(CGRect)rect
{
    CGContextRef currenctContext = UIGraphicsGetCurrentContext();
    [[UIColor blackColor] set];

    CGContextSetLineWidth(currenctContext,_lineWidth);
    CGContextSetLineJoin(currenctContext,kCGLineJoinRound);

    CGContextMoveToPoint(currenctContext,x1,y1);
    CGContextAddLineToPoint(currenctContext,x2,y2);
    CGContextStrokePath(currenctContext);
}

//if drawing inside custom CALayer subclass:
- (void) drawInContext:(CGContextRef)ctx {
{
    //self.contentsScale = [UIScreen mainScreen].scale;

    CGContextRef currenctContext = ctx;
    CGContextSetStrokeColorWithColor(currenctContext,[UIColor blackColor].CGColor);

    CGContextSetLineWidth(currenctContext,y2);
    CGContextStrokePath(currenctContext);
}

重申我想要实现的:我想要实现与UIView方法相同的清晰的视网膜渲染,但是在CALayer中渲染时

解决方法

你在层中使用ShouldRasterize = YES吗?尝试在CALayer子类中绘制,但将rasterizationScale设置为屏幕的比例.

猜你在找的iOS相关文章