Я полагаю, что самый простой подход - установить свойства тени слоя.
В Objective-C:
self.label.layer.shadowColor = UIColor.blackColor.CGColor;
self.label.layer.shadowRadius = 10;
self.label.layer.shadowOpacity = 1;
self.label.layer.shadowOffset = CGSizeZero;
В Swift:
label.layer.shadowColor = UIColor.black.cgColor
label.layer.shadowRadius = 10
label.layer.shadowOpacity = 1
label.layer.shadowOffset = .zero
Уступая:
![enter image description here](https://i.stack.imgur.com/7XV40.png)
Вы сказали:
Но в слоях у меня есть дополнительный контент, куда я не хочу добавлять тень.
Если у вас есть подпредставления или подслои, которые мешают тени, я бы посоветовал вам переместить это содержимое из метки в их собственную иерархию представлений. Трудно быть конкретным, не зная, какие подслои / подпредставления вы добавили на свой ярлык.
Вы сказали:
... Мне тоже нужна непрозрачность тени, и это невозможно без слоев.
Это не совсем так. Вы можете использовать шаблон NSAttributedString
и указать альфа как часть shadowColor
.
например. в Objective-C:
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowOffset = CGSizeZero;
shadow.shadowBlurRadius = 20;
shadow.shadowColor = [UIColor.blackColor colorWithAlphaComponent:1];
NSDictionary<NSAttributedStringKey, id> *attributes = @{ NSShadowAttributeName: shadow };
NSMutableAttributedString *string = [self.label.attributedText mutableCopy];
[string setAttributes:attributes range:NSMakeRange(0, string.length)];
self.label.attributedText = string;
или в Swift:
let shadow = NSShadow()
shadow.shadowOffset = .zero
shadow.shadowBlurRadius = 20
shadow.shadowColor = UIColor.black.withAlphaComponent(1)
let attributes: [NSAttributedString.Key: Any] = [.shadow: shadow]
guard let string = label.attributedText?.mutableCopy() as? NSMutableAttributedString else { return }
string.setAttributes(attributes, range: NSRange(location: 0, length: string.length))
label.attributedText = string