У меня есть некоторые проблемы с CATextLayer, которые могут быть из-за меня, но я не нашел никакой помощи по этой теме. Я на OS X (на iOS он должен быть таким же).CATextLayer получает растрированный слишком рано, и он размыт
Я создаю слои CATextLayer с коэффициентом масштабирования> 1, и то, что я получаю, является размытым текстом. Думаю, слой растеризован перед применением шкалы. Это ожидаемое поведение? Надеюсь, это не так, потому что это просто не имеет смысла ... CAShapeLayer растеризован после того, как применяется матрица преобразования, почему CATextLayer должен быть другим?
В случае, если я делаю что-то неправильно ... что это такое ??
CATextLayer *layer = [CATextLayer layer];
layer.string = @"I like what I am doing";
layer.font = (__bridge CFTypeRef)[NSFont systemFontOfSize:24];
layer.fontSize = 24;
layer.anchorPoint = CGPointZero;
layer.frame = CGRectMake(0, 0, 400, 100);
layer.foregroundColor = [NSColor blackColor].CGColor;
layer.transform = CATransform3DMakeScale(2., 2., 1.);
layer.shouldRasterize = NO;
[self.layer addSublayer:layer];
Решение, которое я использую в данный момент, заключается в том, чтобы установить свойство contentsSlale слоя в коэффициент масштабирования. Проблема заключается в том, что это решение не масштабируется: если масштабный коэффициент для любого из родительских слоев изменяется, то также необходимо обновить contentsScale. Я должен написать код, чтобы пересечь дерево слоев, чтобы обновить свойства contentsScale всех CATextLayers ... не совсем то, что я хотел бы сделать.
Другим решением, которое на самом деле не является решением, является преобразование текста в форму и использование CAShapeLayer. Но тогда я не вижу смысла иметь CATextLayers.
Пользовательский подкласс CALayer может помочь в решении этой проблемы?
EDIT: Даже CAGradientLayer может отображать его содержимое, например CAShapeLayer, после чего применяется его матрица преобразования. Может кто-нибудь объяснить, как это возможно?
EDIT 2: Я предполагаю, что пути и градиенты отображаются в виде списков отображения OpenGL, поэтому они растеризуются в реальном размере на экране самим OpenGL. Тексты растеризуются Core Animation, поэтому они являются растровыми изображениями для OpenGL.
Я думаю, что на данный момент я перейду с содержимым. Возможно, в будущем я буду конвертировать тексты в формы. Для того, чтобы получить лучшие результаты с небольшим количеством работы, это код, который я использую сейчас:
[CATransaction setDisableActions:YES];
CGFloat contentsScale = ceilf(scaleOfParentLayer);
// _scalableTextLayer is a CATextLayer
_scalableTextLayer.contentsScale = contentsScale;
[_scalableTextLayer displayIfNeeded];
[CATransaction setDisableActions:NO];
Hi mahal, спасибо, что ответили. Я не могу изменить размер шрифта при изменении масштаба родительского слоя: размер текста будет умножен на коэффициент масштабирования родителя и на больший размер шрифта без какой-либо выгоды. Я получаю больший, размытый текст. – mbt
Это работало? Затем вы можете добавить несколько подробностей и пометить вопрос как ответ. –