gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 08:09:01 25 4
gpt4 key购买 nike

我有一个自定义的 UIView 可以在覆盖的地方绘制一些东西

- (void)drawRect:(CGRect)rect

这很好用,并且在视网膜屏幕上产生了清晰的结果。

但是,现在我想使绘图所基于的属性可动画化。创建动画属性似乎只能在 CALayer 上进行,因此我没有在 UIView 中进行绘图,而是创建了一个自定义的 CALayer 子类并执行里面的图

- (void) drawInContext:(CGContextRef)ctx

我在此函数中使用的绘图代码与我在自定义 UIViewdrawRect 函数中使用的绘图代码几乎完全相同。

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

如果我把

self.contentsScale = [UIScreen mainScreen].scale;

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

CALayers drawInContext 中渲染清晰的视网膜路径的正确方法是什么?

这里是一些截图(蓝线是有问题的自定义绘图的一部分。黄色部分只是一张图片)

在自定义 UIView 的 drawRect 中绘制:

enter image description here

在自定义 CALayer 的 drawInContext 中绘制:

enter image description here

在自定义 CALayer 的 drawInContext 中绘制,首先设置 self.contentScale:

enter image description here

为了完整起见,这里是(精简版)绘图代码:

//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

中渲染时

最佳答案

问题很可能是这里的 contentScale;请注意,如果您通过覆盖其 layerClass 函数将其分配给自定义 View ,则图层的内容比例可能会被重置。可能还有一些其他情况也会发生这种情况。为安全起见,仅在将图层添加到 View 后才设置内容比例。

尝试在自定义 View 的初始化方法中将主屏幕的比例分配给自定义层。在 Swift 3 中看起来像这样:

layer.contentsScale = UIScreen.mainScreen().scale

或者,在 Swift 4 中:

layer.contentsScale = UIScreen.main.scale

关于CALayers drawInContext 中的 iOS 绘图在视网膜上像素化或模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com