Как сделать эффект тени на ярлыке в 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)