简体   繁体   English

如何在 Swift 中的标签上制作投影效果?

[英]How to make a drop shadow effect on a label in Swift?

I can't figure out how to code a drop shadow on a label.我不知道如何在标签上编写阴影。 I have a score label that changes so just photoshopping text with shadows wont be possible.我有一个乐谱标签会发生变化,因此无法使用带有阴影的 Photoshop 文本。 I need to code it so it automatically has a blurry shadow behind the text at all times.我需要对其进行编码,使其始终自动在文本后面有一个模糊的阴影。 Can anyone come with some examples or help?任何人都可以提供一些例子或帮助吗?


People saying this is a duplicate, the "duplicate" is about drop shadows on UIView, mine is about UILabel.人们说这是重复的,“重复”是关于 UIView 上的阴影,我的是关于 UILabel。 It's not the same thing.这不是一回事。

Give this a try - you can run it directly in a Playground page:试一试——您可以直接在 Playground 页面中运行它:

import UIKit
import PlaygroundSupport

let container = UIView(frame: CGRect(x: 0, y: 0, width: 600, height: 400))

container.backgroundColor = UIColor.lightGray

PlaygroundPage.current.liveView = container

var r = CGRect(x: 40, y: 40, width: 300, height: 60)

let label = UILabel(frame: r)
label.font = UIFont.systemFont(ofSize: 44.0)
label.textColor = .white
label.frame = r
label.text = "Hello Blur"

container.addSubview(label)

label.layer.shadowColor = UIColor.black.cgColor
label.layer.shadowRadius = 3.0
label.layer.shadowOpacity = 1.0
label.layer.shadowOffset = CGSize(width: 4, height: 4)
label.layer.masksToBounds = false

Play around with different values for the shadow Color, Opacity, Radius and Offset为阴影颜色、不透明度、半径和偏移设置不同的值

Result:结果:

在此处输入图像描述

UILabel has a property for changing its shadow, the image below shows the property in attributes inspector and the result. UILabel有一个改变阴影的属性,下图显示了属性检查器中的属性和结果。

在此处输入图像描述

Result of that effect on label对标签产生影响的结果在此处输入图像描述

You can write an extension and use it.您可以编写扩展并使用它。 Place the extension code outside of class ViewController.将扩展代码放在类 ViewController 之外。

I like subtle shadow.我喜欢微妙的阴影。
在此处输入图像描述

extension UILabel {
    func textDropShadow() {
        self.layer.masksToBounds = false
        self.layer.shadowRadius = 2.0
        self.layer.shadowOpacity = 0.2
        self.layer.shadowOffset = CGSize(width: 1, height: 2)
    }

    static func createCustomLabel() -> UILabel {
        let label = UILabel()
        label.textDropShadow()
        return label
    }
}

On your label simply call this method在您的标签上只需调用此方法

myLabel.textDropShadow()

works fine but add shadow to ALL label, not to text.工作正常,但将阴影添加到所有标签,而不是文本。

in this case:在这种情况下:

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let shadow = NSShadow()
        shadow.shadowColor = UIColor.blue
        shadow.shadowBlurRadius = 10
        
        let attrs: [NSAttributedString.Key: Any] = [
            .font: UIFont.systemFont(ofSize: 36),
            .foregroundColor: UIColor.red,
            .shadow: shadow
        ]
        
        let s = "MY TEXT"
        let attributedText = NSAttributedString(string: s, attributes: attrs)
        self.label.attributedText = attributedText
    }


}


You will get:

[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/CRMpg.png




**note:** You must add attributed string every time, as shadow is an attribute of string, not label, otherwise you can also derive class and override "setText". (keeping attributes inside the object in a a property you can set on init/setter)

Swift 4, IBInspectable using extension Swift 4, IBInspectable 使用扩展

extension UILabel {

    @IBInspectable var isShadowOnText: Bool {
        get {
            return self.isShadowOnText
        }
        set {
            guard (newValue as? Bool) != nil else {
                return
            }

            if newValue == true{

                self.layer.shadowColor = UIColor.black.cgColor
                self.layer.shadowRadius = 2.0
                self.layer.shadowOpacity = 1.0
                self.layer.shadowOffset = CGSize(width: 2, height: 2)
                self.layer.masksToBounds = false
            }
        }
    }
}

Swift 4 - Extension with shadow parameters: Swift 4 - 带有影子参数的扩展:

 // Label Shadow
    extension UILabel {
        func lblShadow(color: UIColor , radius: CGFloat, opacity: Float){
            self.textColor = color
            self.layer.masksToBounds = false
            self.layer.shadowRadius = radius
            self.layer.shadowOpacity = opacity

            self.layer.shadowOffset = CGSize(width: 1, height: 1)
            self.layer.shouldRasterize = true
            self.layer.rasterizationScale = UIScreen.main.scale
        }
    }

On your label simply call this method在您的标签上只需调用此方法

let titleColor = UIColor(red:0.08, green:0.08, blue:0.08, alpha:1.0)
titleLbl.lblShadow(color: titleColor, radius: 3, opacity: 0.25)

U can make a extension method for all UIView subclasses.你可以为所有 UIView 子类创建一个扩展方法。

extension UIView {
    func drawShadow(offset: CGSize, opacity: Float = 0.25, color: UIColor = .black, radius: CGFloat = 1) {
        layer.masksToBounds = false
        layer.shadowColor = color.cgColor
        layer.shadowOffset = offset
        layer.shadowOpacity = opacity
        layer.shadowRadius = radius
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM