Стирание текста из нарисованного UIView - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь нарисовать UIView и стереть с него текст, чтобы получить эффект, подобный следующему:

enter image description here

До сих пор я не смог найти способ заставить текст действовать как ластик. Вот где я нахожусь:

enter image description here

CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(c, [UIColor whiteColor].CGColor);
CGContextFillRect(c, self.bounds);
CGContextSetBlendMode(c, kCGBlendModeClear);
CGContextSetTextDrawingMode(c, kCGTextFill);
CGContextSetFont(c, CGFontCreateWithFontName(CFStringCreateWithCString(NULL, "HelveticaNeue-Bold", kCFStringEncodingUTF8)));
CGContextSetFontSize(c, 18.0);
UIGraphicsPushContext(c);
[_text drawInRect:self.bounds
   withAttributes:nil];
UIGraphicsPopContext();

Я надеялся, что CGContextSetBlendMode(c, kCGBlendModeClear); сделает текст ластиком, но пока мне не повезло.

У меня также была идея использовать UILabel в качестве maskView, но я не знаю, как инвертировать его, чтобы текст обрабатывался как отрицательное пространство. Единственные вопросы, которые мне удалось найти при инвертировании масок, - это инвертирование CAShapeLayers или UIImages.

1 Ответ

0 голосов
/ 08 мая 2018

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

Вы можете сделать это, используя метку и вид следующим образом:

let view = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
let label = UILabel(frame: view.frame)
label.text = "$48.99"
label.font = UIFont.systemFont(ofSize: 70)
label.textAlignment = .center
label.textColor = UIColor.white

let underlyingView = UIView(frame: view.frame)
underlyingView.backgroundColor = UIColor.blue
underlyingView.mask = label

view.addSubview(underlyingView)
...