【问题标题】:Drawing a Scrim ("Blurry Transparent Rectangle") Under NSAttributedString Text在 NSAttributedString 文本下绘制 Scrim(“模糊透明矩形”)
【发布时间】:2015-04-15 17:35:43
【问题描述】:

我将文本放在各种图像之上,遇到了this article on overlaying text on images,它建议在文本的边界周围放置模糊的深色矩形,以帮助它从图像中脱颖而出。基本上,就像如果文本的阴影是一个矩形。他们称之为稀松布。

我首先尝试通过真正模糊阴影来实现这一点,但对于细文本,它确实不可见。我想我需要以某种方式在文本后面绘制一个模糊/阴影的矩形。我认为有一些方法可以用 CoreGraphics/CoreText 绘制它。由于我主要处理的是 OpenGL,因此我在绘制这两种方法方面都不是很有经验。

在绘制 NSAttributedStrings 时尝试创建模糊的矩形阴影有什么建议吗?我能否以某种方式使阴影来自另一个对象,例如矩形而不绘制该对象。

【问题讨论】:

  • 类似什么的东西?你的问题的问题是你忽略了清楚地说出你想要做什么。不要指向某篇文章并期望人们猜到重点是什么。 告诉我们重点是什么。问题是什么?目标是什么?
  • 对不起@matt,我只是尝试更新并使其更清晰。如果还不清楚,我会继续。我包含链接以帮助澄清,但我想它没有
  • 我还没有完全理解您的需求,但我已准备好提出初步建议。为什么不直接使用带有深色样式的UIBlurEffect,并将文本放在前面(只是一个简单的 UILabel)?

标签: ios objective-c core-graphics nsattributedstring core-text


【解决方案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;

...然后根据您的喜好使用shadowRadiusshadowOpacity 属性。

【讨论】:

  • 因此对于 CALayer 来说,您似乎可以使用 shadowPath 操作对象阴影。这太酷了! 对我来说唯一的问题是我只有一个 NSAttributedString,我正在调用 drawInRect 来为 OpenGL 制作纹理。有什么办法可以通过 Quartz 调用来做到这一点?
  • 它是——参见 Quartz 2D 编程指南中的 Shadows 部分——但它更复杂。我不知道如何在不绘制投射阴影的情况下轻松绘制阴影。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 2021-04-10
  • 2016-10-05
  • 1970-01-01
  • 2011-07-11
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多