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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/45062569/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 09:19:18  来源:igfitidea点击:

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

iosswiftuilabel

提问by Rasmus Rossen

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. 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?

我不知道如何在标签上编码阴影。我有一个会更改的分数标签,因此无法仅使用带有阴影的 photoshopping 文本。我需要对其进行编码,以便它始终在文本后面自动有一个模糊的阴影。任何人都可以提供一些示例或帮助吗?



People saying this is a duplicate, the "duplicate" is about drop shadows on UIView, mine is about UILabel. It's not the same thing.

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

回答by DonMag

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:

结果:

enter image description here

在此处输入图片说明

回答by Maulik Pandya

UILabelhas a property for changing its shadow, the image below shows the property in attributes inspector and the result.

UILabel有一个改变其阴影的属性,下图显示了属性检查器中的属性和结果。

enter image description here

在此处输入图片说明

Result of that effect on label enter image description here

该效果对标签的结果 在此处输入图片说明

回答by deepakssn

You can write an extensionand use it. Place the extension code outsideof class ViewController.

您可以编写一个扩展并使用它。将扩展代码放在类 ViewController之外

I like subtle shadow.
enter image description here

我喜欢微妙的阴影。
在此处输入图片说明

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()

回答by Pramod More

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
            }
        }
    }
}

回答by deepakssn

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)

回答by ingconti

works fine but add shadow to ALL label, not to text.

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

in this case:

在这种情况下:

class ViewController: UIViewController {

类视图控制器: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

在此处输入图片说明

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)

注意:每次都必须添加属性字符串,因为shadow是字符串的属性,而不是标签,否则您也可以派生类并覆盖“setText”。(将属性保留在对象内的 aa 属性中,您可以在 init/setter 上设置)