如何在Swift中对标签制作阴影效果?

Ras*_*sen 26 uilabel ios swift

我无法弄清楚如何在标签上编码投影.我有一个改变的分数标签,所以只有带有阴影的photoshopping文本是不可能的.我需要对其进行编码,以便它始终在文本后面自动显示模糊的阴影.任何人都可以提供一些例子或帮助吗?


人们说这是重复的,"重复"是关于UIView上的阴影,我的是关于UILabel.这不是一回事.

Don*_*Mag 59

尝试一下 - 您可以直接在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
Run Code Online (Sandbox Code Playgroud)

使用阴影颜色,不透明度,半径和偏移的不同值进行游戏

结果:

在此输入图像描述


Mau*_*dya 17

UILabel 有一个用于更改其阴影的属性,下面的图像显示属性检查器中的属性和结果.

在此输入图像描述

对标签产生影响的结果 在此输入图像描述


dee*_*ssn 13

您可以编写扩展程序并使用它.将扩展代码放在 ViewController类之外.

我喜欢微妙的影子.
在此输入图像描述

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
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的标签上只需调用此方法即可

myLabel.textDropShadow()
Run Code Online (Sandbox Code Playgroud)


ing*_*nti 6

工作正常,但为所有标签添加阴影,而不是文本。

在这种情况下:

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)
Run Code Online (Sandbox Code Playgroud)


dee*_*ssn 5

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
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的标签上只需调用此方法

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


Pra*_*ore 5

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)