Рисуване на 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), така че ако искате кутия, която започва 50pt вляво от етикета и 30pt отгоре и е с размер 200x100pt, бихте направили това вместо това:

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