Je sais que les ombres douces ne sont pas prises en charge par l'UILabel prêt à l'emploi, sur l'iPhone. Alors, quelle serait la meilleure façon de mettre en œuvre la mienne?
MODIFIER:
Évidemment, je vais sous-classer le UILabel
et dessiner dans le -drawRect: Ma question est, comment puis-je obtenir le contenu de l'étiquette en tant que graphiques et dessiner autour d'eux, les estomper, etc.
EDIT 2:
Je suis revenu sur cette question environ un an plus tard. En attendant, j'ai construit une classe qui vous permet d'ajouter facilement une ombre douce à une étiquette et de modifier son rayon, etc., ainsi que de dessiner des dégradés sur le texte lui-même. Vous pouvez le trouver sur GitHub: https://github.com/doukasd/iOS-Components/tree/master/Views
Cette réponse à cette question similaire fournit le code pour dessiner une ombre floue derrière un UILabel. L'auteur utilise CGContextSetShadow () pour générer l'ombre du texte dessiné.
Depuis la version 3.2, il existe un support direct pour les ombres dans le SDK.
label.layer.shadowColor = [label.textColor CGColor];
label.layer.shadowOffset = CGSizeMake(0.0, 0.0);
Importer <QuartzCore/QuartzCore.h>
et jouer avec quelques paramètres:
label.layer.shadowRadius = 3.0;
label.layer.shadowOpacity = 0.5;
Et, si vous trouvez votre ombre coupée par les limites de l'étiquette:
label.layer.masksToBounds = NO;
enfin réglé
label.layer.shouldRasterize = YES
Je vous conseille d'utiliser les propriétés shadowColor et shadowOffset de UILabel:
UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);
En plus de la réponse d'IIDan: à certaines fins, il est nécessaire de définir
label.layer.shouldRasterize = YES
Je pense que cela est dû au mode de fusion utilisé pour rendre l'ombre. Par exemple, j'avais un fond sombre et du texte blanc dessus et je voulais "surligner" le texte en utilisant une lueur noire ombragée. Cela ne fonctionnait pas jusqu'à ce que je définisse cette propriété.
Appliquez l'ombre (douce) sur la vue calque, comme ceci:
UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;
Pour garder les choses à jour: Créer l'ombre dans Swift est aussi simple que cela:
Importez le framework QuartzCore
import QuartzCore
Et définissez les attributs d'ombre sur votre étiquette
titleLabel.shadowColor = UIColor.blackColor()
titleLabel.shadowOffset = CGSizeMake(0.0, 0.0)
titleLabel.layer.shadowRadius = 5.0
titleLabel.layer.shadowOpacity = 0.8
titleLabel.layer.masksToBounds = false
titleLabel.layer.shouldRasterize = true
_nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
_nameLabel.font = [UIFont boldSystemFontOfSize:19.0f];
_nameLabel.textColor = [UIColor whiteColor];
_nameLabel.backgroundColor = [UIColor clearColor];
_nameLabel.shadowColor = [UIColor colorWithWhite:0 alpha:0.2];
_nameLabel.shadowOffset = CGSizeMake(0, 1);
je pense que vous devriez utiliser le [UIColor colorWithWhite: 0 alpha: 0.2] pour définir la valeur alpha.
J'ai essayé presque toutes ces techniques (sauf FXLabel) et je n'ai pas réussi à faire fonctionner l'une d'elles avec iOS 7. J'ai finalement trouvé THLabel qui fonctionne parfaitement pour moi. J'ai utilisé THLabel dans Interface Builder et configuré les attributs d'exécution définis par l'utilisateur afin qu'il soit facile pour un non-programmeur de contrôler l'apparence.
C'est comme un truc,
UILabel *customLabel = [[UILabel alloc] init];
UIColor *color = [UIColor blueColor];
customLabel.layer.shadowColor = [color CGColor];
customLabel.layer.shadowRadius = 5.0f;
customLabel.layer.shadowOpacity = 1;
customLabel.layer.shadowOffset = CGSizeZero;
customLabel.layer.masksToBounds = NO;
Sous-classe UILabel, comme indiqué, puis, dans drawRect :, do [self drawTextInRect:rect];
pour que le texte soit tracé dans le contexte actuel. Une fois qu'il est là, vous pouvez commencer à travailler avec lui en ajoutant des filtres et ainsi de suite. Si vous voulez créer une ombre portée avec ce que vous venez de dessiner dans le contexte, vous devriez pouvoir utiliser:
CGContextSetShadowWithColor()
Recherchez cette fonction dans les documents pour savoir comment l'utiliser.
J'ai écrit une bibliothèque qui fournit une sous-classe UILabel avec un support d'ombre douce et un tas d'autres effets:
Dans Swift 3
, vous pouvez créer une extension:
import UIKit
extension UILabel {
func shadow() {
self.layer.shadowColor = self.textColor.cgColor
self.layer.shadowOffset = CGSize.zero
self.layer.shadowRadius = 3.0
self.layer.shadowOpacity = 0.5
self.layer.masksToBounds = false
self.layer.shouldRasterize = true
}
}
et l'utiliser via:
label.shadow()
Depuis iOS 5 Apple fournit une méthode API privée pour créer des étiquettes avec des ombres douces. Les étiquettes sont très rapides: j'utilise des dizaines en même temps dans une série de vues transparentes et il y a aucun ralentissement dans l'animation de défilement.
Cela n'est utile que pour les applications non App Store (évidemment) et vous avez besoin du fichier d'en-tête.
$SBBulletinBlurredShadowLabel = NSClassFromString("SBBulletinBlurredShadowLabel");
CGRect frame = CGRectZero;
SBBulletinBlurredShadowLabel *label = [[[$SBBulletinBlurredShadowLabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.font = [UIFont boldSystemFontOfSize:12];
label.text = @"I am a label with a soft shadow!";
[label sizeToFit];