У меня есть пользовательский UIView, который рисует что-то в перезаписанногоIOS рисунок в CALayers drawInContext либо некачественно или размыто на сетчатке
- (void)drawRect:(CGRect)rect
это прекрасно работает и дает точные результаты на экранах сетчатки глаза.
Однако, теперь я хотел бы сделать свойства, на которых рисунок основан на анимации. Создание Animatable свойств представляется возможным только на CALayer, поэтому вместо того, чтобы делать рисунок в UIView, создать пользовательский CALayer подкласс и сделать рисунок внутри
- (void) drawInContext:(CGContextRef)ctx
Я использую довольно много и тот же код рисования в этом как я использовал в функции drawRect пользовательского UIView.
Результат выглядит так же, - однако, это не сетчатка разрешение, но неровной (большие квадратные пиксели)
если я ставлю
self.contentsScale = [UIScreen mainScreen].scale;
К началу моей реализации drawInContext, то вместо некачественно результат, я получаю размытый результат (как будто рендеринг по-прежнему выполняется без разрешения сетчатки, а затем масштабируется до разрешения сетчатки).
Каков правильный способ визуализации острых путей сетчатки в CALayers drawInContext?
вот некоторые скриншоты (синяя линия является частью пользовательского чертежа в вопросе желтая часть всего изображения.)
Нарисованные внутри DrawRect пользовательских UIView в:
Нарисованные внутри пользовательских CALayer в drawInContext:
Drawin внутри drawInContext пользовательских CALayer, в с первой установкой 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
в сетчатке дисплей, вам нужно умножить ширину и высоту на 2. – Bejibun
нет, размер и расположение на экране правильно – user1282931
Я имею в виду экран вы просто создаете, должны быть умножены на 2, потому что дисплей сетчатки требует двойного разрешения. – Bejibun