Как сделать эффект тени на ярлыке в Swift?

Я не могу понять, как закодировать тень на ярлыке. У меня есть метка оценки, которая меняется, поэтому просто фотошоп с тенями не будет возможен. Мне нужно закодировать его, чтобы он всегда имел размытую тень за текстом во все времена. Может ли кто-нибудь прийти с примерами или помочь?


Люди, говорящие, что это дубликат, "дубликат" - это опускающиеся тени на UIView, мой - о UILabel. Это не то же самое.

Ответ 1

Попробуйте попробовать - вы можете запустить его прямо на странице игровой площадки:

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

Играйте с различными значениями для тени Цвет, непрозрачность, радиус и смещение

Результат:

введите описание изображения здесь

Ответ 2

У UILabel есть свойство для изменения его тени, на рисунке ниже показано свойство в инспекторе атрибутов и результат.

enter image description here

Результат этого эффекта на этикетке enter image description here

Ответ 3

Вы можете написать расширение и использовать его. Разместите код расширения вне класса ViewController.

Мне нравится легкая тень.
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
    }
}

На вашем ярлыке просто вызовите этот метод

myLabel.textDropShadow()

Ответ 4

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

На вашем ярлыке просто вызовите этот метод

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

Ответ 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
            }
        }
    }
}

Ответ 6

работает нормально, но добавляет тень на ВСЕ метки, а не на текст.

в этом случае:

Класс 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
}

}

Вы получите:

enter image description here

примечание: Вы должны добавлять приписанную строку каждый раз, так как тень является атрибутом строки, а не метки, в противном случае вы также можете получить класс и переопределить "setText". (хранение атрибутов внутри объекта в свойстве, которое вы можете установить в init/setter)