Ответ 1
Так как iOS 8 Apple предлагает новый класс UIVibranceEffect, который можно добавить в UIVisualEffectView. Это в сочетании с UIBlurEffect может достичь того же результата, что и мой скриншот выше.
Я хотел бы добиться того же эффекта, что и в новом удаленном обновлении iTunes для iOS 7 для моего UILabel
.
Если вы посмотрите на этот экран:
(Тот, что справа) вы заметите, что цвет текста 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, игнорируя вторую/маску).
Я не могу обернуть голову вокруг решения, чтобы добиться этого эффекта.
Так как iOS 8 Apple предлагает новый класс UIVibranceEffect, который можно добавить в UIVisualEffectView. Это в сочетании с UIBlurEffect может достичь того же результата, что и мой скриншот выше.
Я не думаю, что вы сможете напрямую сделать это с помощью 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.
Цвет не является однородным. Но это на самом деле "вырезано", чтобы просветлить размытый и тонированный фон.
Один из способов сделать это - построить CGPath для глифов, кликнуть графический контекст для них, затем очистить контекст, оставив область вне черной и область внутри fhe glyths полупрозрачной.
Альтернативным подходом является создание цвета шаблона из этого большого размытого тонированного обложки и использование этого цвета шаблона на UILabel.