本文介绍了CALayers中的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
:
在自定义CALayer内绘制drawInContext
:
在自定义CALayer的drawInContext
内部绘制,首先设置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, _lineWidth);
CGContextSetLineJoin(currenctContext,kCGLineJoinRound);
CGContextMoveToPoint(currenctContext,x1, y1);
CGContextAddLineToPoint(currenctContext,x2, y2);
CGContextStrokePath(currenctContext);
}
重申我想要实现的目标:我希望实现与UIView
方法相同的清晰视网膜渲染,但在CALayer
推荐答案
问题很可能是Content Scale;请注意,如果通过覆盖其layerClass
函数将其分配给自定义视图,层的内容比例可能会被重置。可能还有其他一些情况也会发生这种情况。为安全起见,请仅在将层添加到视图后设置内容比例。
layer.contentsScale = UIScreen.mainScreen().scale
或者,在SWIFT 4中:
layer.contentsScale = UIScreen.main.scale
这篇关于CALayers中的iOS绘图在视网膜上显示为像素化或模糊的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!