【问题标题】:iPhone UILabel text soft shadowiPhone UILabel 文字软阴影
【发布时间】:2010-12-15 02:42:56
【问题描述】:

我知道 iPhone 上的 UILabel 不支持软阴影。那么实现我自己的最佳方法是什么?

编辑:

显然,我将继承 UILabel 并在 -drawRect 中绘制: 我的问题是,如何将标签的内容作为图形获取并围绕它们进行绘制、模糊等...

编辑 2:

大约一年后我回到了这个问题。与此同时,我建立了一个类,允许您轻松地为标签添加软阴影并调整它的半径等,还可以在文本本身上绘制渐变。你可以在 GitHub 上找到它:https://github.com/doukasd/iOS-Components/tree/master/Views

【问题讨论】:

  • Base SDK4.0这个怎么实现?

标签: iphone objective-c iphone-sdk-3.0 uilabel shadow


【解决方案1】:

子类UILabel,并覆盖-drawInRect:

【讨论】:

  • 好的,这是显而易见的部分。然后呢?
【解决方案2】:

This answerthis similar question 提供了在 UILabel 后面绘制模糊阴影的代码。作者使用CGContextSetShadow()为绘制的文本生成阴影。

【讨论】:

  • 太棒了,而且效果和宣传的一样!谢谢。但是你知道我怎样才能让阴影更强烈吗?由于它是上下文的一部分,我不能多次绘制它,这样就可以了。
  • 您可以将颜色更改为具有 100% 不透明度的黑色(在他的示例中,它只有 80%),以及在 CGContextSetShadow() 调用中更改阴影半径。您也可以尝试从他设置的 4,-4 位置移动偏移量。
  • 是的,我试过 100% 的不透明度等。关于尺寸,你设置的越大,阴影就越不明显......我正在寻找类似于阴影效果的东西Flash,您可以将其设置为 100% 以上。
  • Base SDK4.0这个怎么实现?
  • @Apple - 那里的代码有什么问题?链接答案中的所有内容今天仍然适用于当前的 iOS 版本。
【解决方案3】:

子类 UILabel,如前所述,然后在 drawRect: 中执行 [self drawTextInRect:rect]; 以将文本绘制到当前上下文中。一旦它在那里,您可以通过添加过滤器和诸如此类的东西开始使用它。如果您想用刚刚在上下文中绘制的内容制作阴影,您应该可以使用:

CGContextSetShadowWithColor()

在文档中查看该函数以了解如何使用它。

【讨论】:

    【解决方案4】:

    我建议你使用 UILabel 的 shadowColor 和 shadowOffset 属性:

    UILabel* label = [[UILabel alloc] init];
    label.shadowColor = [UIColor whiteColor];
    label.shadowOffset = CGSizeMake(0,1);
    

    【讨论】:

    • 谢谢,但是是的。我实际上是在寻找 soft 阴影。
    • 对于“柔和”阴影 - 也许您可以正确更改颜色?例如,我需要“柔和”的暗影。 - 因为 blackColor 太锐利了,所以我最终选择了 grayColor :) 编码愉快! :)
    • 他的意思是一个模糊的阴影,没有锐利的边缘。
    【解决方案5】:

    在视图的上应用(软)阴影,如下所示:

    UILabel *label = [[UIabel alloc] init];
    label.layer.shadowColor = [[UIColor whiteColor] CGColor];
    label.layer.shadowOpacity = 1.0;
    

    【讨论】:

      【解决方案6】:

      从 3.2 开始,SDK 中直接支持阴影。

      label.layer.shadowColor = [label.textColor CGColor];
      label.layer.shadowOffset = CGSizeMake(0.0, 0.0);
      

      #import <QuartzCore/QuartzCore.h> 并使用一些参数:

      label.layer.shadowRadius = 3.0;
      label.layer.shadowOpacity = 0.5;
      

      而且,如果你发现你的阴影被标签边界剪掉了:

      label.layer.masksToBounds = NO;
      

      终于确定了

      label.layer.shouldRasterize = YES;
      

      【讨论】:

      • 请注意,要使用 shadowRadius,您必须包含 QuartzCore 标头:#import <QuartzCore/QuartzCore.h>
      • 由于某种原因,这对我的 UILabel 没有影响
      • + 1 表示 maskToBounds 额外信息。
      • maskToBounds 默认为 NO,请编辑您的示例,因为 shadowRadius = 20 非常高,因此可能无法正常工作(例如我的情况,也可能适用于 @Pascalius)。即使是 3(默认值)对于小标签来说也有点太多了。
      • 另外——我发现你需要将标签的背景颜色设置为clearColor,否则你将看不到阴影。
      【解决方案7】:

      从 iOS 5 开始,Apple 提供了一种私有 api 方法来创建带有软阴影的标签。 标签非常快:我在一系列透明视图中同时使用了几十个标签,并且滚动动画没有减慢。

      这仅对非 App Store 应用有用(显然)并且您需要头文件。

      $SBBulletinBlurredShadowLabel = NSClassFromString("SBBulletinBlurredShadowLabel");
      
      CGRect frame = CGRectZero;
      
      SBBulletinBlurredShadowLabel *label = [[[$SBBulletinBlurredShadowLabel alloc] initWithFrame:frame] autorelease];
      label.backgroundColor = [UIColor clearColor];
      label.textColor = [UIColor whiteColor];
      label.font = [UIFont boldSystemFontOfSize:12];
      label.text = @"I am a label with a soft shadow!";
      [label sizeToFit];
      

      【讨论】:

      • 如果你的应用要进入应用商店,你不想使用这个。
      • 好吧,公平地说,他在回答中说。
      • 你为什么不想在潜在的 App Store 提交中使用它??
      【解决方案8】:

      我写了一个库,它提供了一个 UILabel 子类,支持软阴影和一堆其他效果:

      https://github.com/nicklockwood/FXLabel

      【讨论】:

        【解决方案9】:

        除了 IIDan 的回答: 出于某些目的,有必要设置

        label.layer.shouldRasterize = YES
        

        我认为这是由于用于渲染阴影的混合模式。例如,我有一个深色背景和白色文本,并想使用黑色阴影辉光“突出显示”文本。在我设置此属性之前它无法正常工作。

        【讨论】:

        • 即使在视图中有几十个 UILabel 时也需要这样做以使其更快。没有它,如果与不透明度一起使用,阴影会变慢。
        • 如果您打算使用shouldRasterize,请确保您还设置了rasterizationScalelabel.layer.rasterizationScale = [UIScreen mainScreen].scale;,否则它在视网膜屏幕上可能看起来很奇怪。
        【解决方案10】:
        _nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        _nameLabel.font = [UIFont boldSystemFontOfSize:19.0f];
        _nameLabel.textColor = [UIColor whiteColor];
        _nameLabel.backgroundColor = [UIColor clearColor];
        _nameLabel.shadowColor = [UIColor colorWithWhite:0 alpha:0.2];
        _nameLabel.shadowOffset = CGSizeMake(0, 1);
        

        我认为你应该使用 [UIColor colorWithWhite:0 alpha:0.2] 来设置 alpha 值。

        【讨论】:

          【解决方案11】:

          我尝试了几乎所有这些技术(FXLabel 除外),但无法让它们中的任何一个与 iOS 7 一起使用。我最终发现 THLabel 非常适合我。我在 Interface Builder 中使用了 THLabel 并设置了用户定义的运行时属性,以便非程序员可以轻松控制外观。

          https://github.com/MuscleRumble/THLabel

          【讨论】:

            【解决方案12】:

            这就像一个把戏,

            UILabel *customLabel = [[UILabel alloc] init];
            
            UIColor *color = [UIColor blueColor];
            customLabel.layer.shadowColor = [color CGColor];
            customLabel.layer.shadowRadius = 5.0f;
            customLabel.layer.shadowOpacity = 1;
            customLabel.layer.shadowOffset = CGSizeZero;
            customLabel.layer.masksToBounds = NO;
            

            【讨论】:

              【解决方案13】:

              保持最新:在 Swift 中创建阴影就这么简单:

              导入 QuartzCore 框架

              import QuartzCore
              

              并将阴影属性设置为您的标签

              titleLabel.shadowColor = UIColor.blackColor()
              titleLabel.shadowOffset = CGSizeMake(0.0, 0.0)
              titleLabel.layer.shadowRadius = 5.0
              titleLabel.layer.shadowOpacity = 0.8
              titleLabel.layer.masksToBounds = false
              titleLabel.layer.shouldRasterize = true
              

              【讨论】:

              • 奇怪的是,这会导致文本上方(y 方向)出现阴影,而不是与其对齐。
              【解决方案14】:

              Swift 3,你可以创建一个扩展:

              import UIKit
              
              extension UILabel {
                  func shadow() {
                      self.layer.shadowColor = self.textColor.cgColor
                      self.layer.shadowOffset = CGSize.zero
                      self.layer.shadowRadius = 3.0
                      self.layer.shadowOpacity = 0.5
                      self.layer.masksToBounds = false
                      self.layer.shouldRasterize = true
                  }
              }
              

              并通过以下方式使用它:

              label.shadow()
              

              【讨论】:

                【解决方案15】:

                虽然无法直接在UILabel 上设置模糊半径,但您绝对可以通过操纵 CALayer 来更改它。

                刚刚设置:

                //Required properties
                customLabel.layer.shadowRadius = 5.0 //set shadow radius to your desired value.
                customLabel.layer.shadowOpacity = 1.0 //Choose an opacity. Make sure it's visible (default is 0.0)
                
                //Other options
                customLabel.layer.shadowOffset = CGSize(width: 10, height: 10)
                customLabel.layer.shadowColor = UIColor.black.cgColor
                customLabel.layer.masksToBounds = false
                

                我希望对某人有所帮助而其他答案未能澄清的是,如果您在尝试设置 .layer.shadowRadius 时还直接在 Interface Builder 上设置 UILabel Shadow Color 属性,它将不起作用

                因此,如果设置 label.layer.shadowRadius 不起作用,请在 Interface Builder 上为 UILabel 验证 Shadow Color。它应该设置为default。然后,如果您想要黑色以外的阴影颜色,请也通过.layer 属性设置此颜色。

                【讨论】:

                  猜你喜欢
                  • 2017-11-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-04-16
                  • 2017-06-08
                  • 2016-05-09
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多