Рисование Scrim (размытого прозрачного прямоугольника) под текстом NSAttributedString

Я помещал текст поверх различных изображений и наткнулся на эта статья о наложении текста на изображения, в которой предлагается размещать размытый темный прямоугольник вокруг границ текста, чтобы он выделялся на изображении. В основном, как если бы тень текста представляли собой прямоугольник. Они называют это скримом.

Сначала я попробовал это, действительно размыв тень, но с тонким текстом это действительно не видно. Я полагаю, мне нужно как-то нарисовать размытый/теневой прямоугольник за текстом. Я полагаю, что есть способ нарисовать это с помощью CoreGraphics/CoreText. Я не очень опытен в рисовании ни тем, ни другим, так как имел дело в основном с OpenGL.

Любое предложение по попытке создать размытую прямоугольную тень при рисовании NSAttributedStrings? Могу ли я каким-то образом заставить тень исходить от другого объекта, такого как прямоугольник, не рисуя этот объект.


person tettoffensive    schedule 15.04.2015    source источник
comment
Что-то вроде что? Проблема с вашим вопросом в том, что вы забыли четко сказать, что вы хотите сделать. Не указывайте на какую-то статью и не ждите, что люди догадаются, в чем ее суть. Вы говорите нам, в чем суть. Какой вопрос? Какова цель?   -  person matt    schedule 15.04.2015
comment
извините, @matt, я просто попытался обновить и сделать его более ясным. Я продолжу, если это все еще не ясно. Я включил ссылку, чтобы уточнить, но я думаю, что это не так   -  person tettoffensive    schedule 16.04.2015
comment
Я все еще не совсем понимаю, что вам нужно, но я готов сделать первоначальное предложение. Почему бы вам просто не использовать UIBlurEffect с темным стилем и поместить перед ним текст (простой UILabel)?   -  person matt    schedule 16.04.2015


Ответы (1)


Есть довольно простой способ сделать это с помощью CALayer shadowPath. Обычное использование выглядит так:

myLabel.layer.shadowPath = [UIBezierPath bezierPathWithRect:myLabel.layer.bounds].CGPath;
myLabel.layer.shadowRadius = 10;
myLabel.layer.shadowOpacity = 0.5;

В вашем случае это звучит так, как будто вы хотите, чтобы вокруг вашей метки была большая рамка, поэтому вам нужно изменить прямоугольник, передаваемый в +bezierPathWithRect:. Этот путь указан в координатном пространстве слоя (т. е. левый верхний угол равен 0,0), поэтому, если вам нужен блок, который начинается на 50 пт слева от метки и на 30 пт выше и имеет размер 200 x 100 пт, вы должны сделать это вместо:

myLabel.layer.shadowPath = [UIBezierPath bezierPathWithRect:CGRectMake(-50, -30, 200, 100)].CGPath;

…затем поиграйте со свойствами shadowRadius и shadowOpacity на свой вкус.

person Noah Witherspoon    schedule 15.04.2015
comment
Таким образом, для CALayer вы можете манипулировать тенью объектов с помощью shadowPath. Это действительно круто! Единственная проблема для меня заключается в том, что у меня есть NSAttributedString, для которой я вызываю drawInRect, чтобы создать текстуру для OpenGL. Можно ли как-нибудь сделать это с вызовами Quartz? - person tettoffensive; 16.04.2015
comment
Это — см. Тени. в Руководстве по программированию Quartz 2D, но это сложнее. Я не уверен, как можно легко нарисовать тень, не нарисовав при этом то, что ее отбрасывает. - person Noah Witherspoon; 18.07.2015