superview.superview 上的透明 UILabel textColor(有点)
Posted
技术标签:
【中文标题】superview.superview 上的透明 UILabel textColor(有点)【英文标题】:Transparent UILabel textColor on superview.superview (sort of) 【发布时间】:2013-11-05 10:51:36 【问题描述】:我想为我的UILabel
实现与 ios 7 的新 iTunes 远程更新相同的效果。
如果你看这个屏幕:
(右侧)您会注意到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 上有一个透明的文本颜色,忽略第二个/Mask)。
我无法想出一个解决方案来达到这个效果。
【问题讨论】:
我想要相同的功能,即使我使用 OHAttributed 标签和一些 RSMaskedlabel 代码实现了它。但我想更改该特定文本的颜色,并且在屏蔽之后我什至无法更改任何内容。你有什么解决办法吗? 发布您尝试过的代码、迄今为止的结果以及它们与您想要的内容的差距。并保留它 SSCCE:sscce.org 你想给UILabel设置透明背景色..? 【参考方案1】:从 iOS 8 开始,Apple 提供了一个新类 UIVibrancyEffect,它可以添加到 UIVisualEffectView。这与 UIBlurEffect 结合可以达到与我上面的截图完全相同的结果。
来源:https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIVibrancyEffect/index.html
【讨论】:
【参考方案2】:我认为您无法直接使用 UILabel 来执行此操作。我所做的是把它分解成几部分:
如何仅绘制标签的背景。为此,我抄袭了CGPathRef from string 的代码,将字符串转换为路径。然后子类化 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,将图形上下文剪辑到它们,然后清除上下文,使字形之外的区域保持黑色,而字形内部的区域为半透明。
另一种方法是从这个大的模糊着色封面艺术创建一个图案颜色,并在 UILabel 上使用这个图案颜色。
【讨论】:
以上是关于superview.superview 上的透明 UILabel textColor(有点)的主要内容,如果未能解决你的问题,请参考以下文章