У меня есть пользовательский UIView
который рисует что-то в перезаписанном
- (void)drawRect:(CGRect)rect
это прекрасно работает и дает четкие результаты на экранах сетчатки.
Однако теперь я хотел бы сделать свойства, на которых основан чертеж, анимируемыми. Создание анимируемых свойств представляется возможным только в CALayer
, поэтому вместо рисования в UIView
я создаю собственный подкласс CALayer
и выполняю рисование внутри
- (void) drawInContext:(CGContextRef)ctx
В этой функции я использую практически тот же код рисования, что и в функции drawRect
пользовательского UIView
.
Результат выглядит одинаково - однако, это не разрешение сетчатки, а пиксельное (большие квадратные пиксели)
если я положу
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