Шрифт CATextLayer borderColor? - PullRequest
       4

Шрифт CATextLayer borderColor?

4 голосов
/ 02 января 2012

Я бы хотел, чтобы мой текст был обведен белой рамкой.Я использую CATextLayer для текста.Я знаю, что нет свойства borderColor / borderWidth для CATextLayer.Конечно я могу использовать свойства его суперкласса (CALayer), но тогда он рисует границу вокруг рамки слоя, а не вокруг самого текста.Кто-нибудь знает, как я мог добиться этого с помощью CATextLayer?

enter image description here

Ответы [ 2 ]

5 голосов
/ 03 января 2012

На всякий случай, если кто-то заинтересован в моем решении:

По сути, можно создавать текст с обводкой (рамкой) без непосредственного использования CoreText.Строковое свойство CATextLayer принимает NSAttributedStrings.Следовательно, это было бы так же просто, как присвоение NSAttributedString с цветом обводки и шириной обводки в его атрибутах.

К сожалению, мне нужно было анимировать размер шрифта.Свойство string является анимируемым, но только если это строка NSString.Поэтому я решил создать подкласс CATextLayer.После долгих попыток я понял, что свойства строки и содержимого CATextLayer являются взаимоисключающими, что означает, что отображается либо строка, либо содержимое.Я не мог понять, как сделать рисунок строки самостоятельно.Методы display и drawInContext: ctx вызываются только при обновлении содержимого, но я не знал, что мне придется вызывать для обновления строки.

Поэтому я решил написать свой собственный класс CATextLayer, подкласс CALayer.Я создал анимируемое свойство с именем fontSize.Когда этот анимирован, вызывается метод drawInContext: ctx.В методе drawInContext: ctx я создаю новую строку с CoreText и соответствующим образом обновляю ее размер, используя свойство fontSize.

3 голосов
/ 26 апреля 2014

Для тех, кто заинтересован в решении, не беспокоясь об анимации размера шрифта:

@import QuartzCore;
@import CoreText;

- (void)addTextLayer
{
   NSDictionary* attributes = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:40.0],
                                 (NSString*)kCTForegroundColorAttributeName: (id)[UIColor blackColor].CGColor,
                                 (NSString*)kCTStrokeWidthAttributeName: @(-2.0),
                                 (NSString*)kCTStrokeColorAttributeName: (id)[UIColor whiteColor].CGColor };
   CATextLayer* textLayer = [CATextLayer layer];
   textLayer.string = [[NSAttributedString alloc] initWithString:@"Hello World" attributes:attributes];

   // Do the rest...
}
...