Прозрачный UILabel textColor на superiew.superview(вроде)

Я хотел бы добиться того же эффекта, что и в новом удаленном обновлении iTunes для iOS 7 для моего UILabel.

Если вы посмотрите на этот экран:

http://313e5987718b346aaf83-f5e825270f29a84f7881423410384342.r78.cf1.rackcdn.com/1383617182-2013-11-05_03.05.58_04.png

(Тот, что справа) вы заметите, что цвет текста UILabel является фоновой размытой обложкой альбома без черной маски.

В настоящий момент у меня есть прозрачный UILabel textColor (http://cl.ly/SInK), мой код похож на https://github.com/robinsenior/RSMaskedLabel

Мое первое предположение состоит в том, чтобы иметь такую ​​иерархию представлений

UIImageView (Light blurred image)
    |
UIImageView/UIView (Dark blurred image or just a dark mask for the superview)
    |
UILabel (And all my other view). 

Я хотел бы, чтобы UILabel имел прозрачный цвет текста в первом UIImageView, игнорируя вторую/маску).

Я не могу обернуть голову вокруг решения, чтобы добиться этого эффекта.

Ответ 2

Я не думаю, что вы сможете напрямую сделать это с помощью UILabel. Я сделал разложение на несколько частей:

Как нарисовать только фон метки. Для этого я вырезал код из CGPathRef из строки, чтобы превратить строку в путь. Тогда подклассификация UILabel и добавление следующего drawRect сделали соответствующую вещь.

-(void)drawRect:(CGRect)rect {
    CGContextRef        ctx = UIGraphicsGetCurrentContext();
    CGContextSaveGState(ctx);

    // Convert the attributed text to a UIBezierPath
    CGPathRef           path = [self.attributedText createPath];

    // Adjust the path bounds horizontally as requested by the view
    CGRect              bounds = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines];
    CGAffineTransform   xform = CGAffineTransformMakeTranslation(bounds.origin.x, bounds.origin.y);

    // Adjust the path bounds vertically because it doesn't seem to be taken into account yet
    bounds = CGPathGetBoundingBox(path);
    xform = CGAffineTransformTranslate(xform, 0., (self.bounds.size.height - bounds.size.height) / 2.);

    // Apply the transform to the path
    path = CGPathCreateCopyByTransformingPath(path, &xform);

    // Set colors, the fill color should be the background color because we're going
    //  to draw everything BUT the text, the text will be left clear.
    CGContextSetFillColorWithColor(ctx, self.textColor.CGColor);

    // Flip and offset things
    CGContextScaleCTM(ctx, 1., -1.);
    CGContextTranslateCTM(ctx, 0., 0. - self.bounds.size.height);

    // Invert the path
    CGContextAddRect(ctx, self.bounds);
    CGContextAddPath(ctx, path);
    CGContextDrawPath(ctx, kCGPathEOFill);

    // Discard the path
    CFRelease(path);

    // Restore gstate
    CGContextRestoreGState(ctx);
}

Если вы создаете UILabel в построителе интерфейса, задайте класс, установите цвет фона для очистки и цвет переднего плана на предлагаемый цвет заливки, фон покажет, где находится текст.

Чтобы размыть тело, отображаемое через ярлык, я сбросил FXBlurView (https://github.com/nicklockwood/FXBlurView) под меткой с ограничениями размера, чтобы сохранить их выровнены.

Вы можете видеть, что все это работает здесь https://github.com/dwb357/TransparentLabel.

Ответ 3

Цвет не является однородным. Но это на самом деле "вырезано", чтобы просветлить размытый и тонированный фон.

Один из способов сделать это - построить CGPath для глифов, кликнуть графический контекст для них, затем очистить контекст, оставив область вне черной и область внутри fhe glyths полупрозрачной.

Альтернативным подходом является создание цвета шаблона из этого большого размытого тонированного обложки и использование этого цвета шаблона на UILabel.