iPhone UILabel texte ombre douce

Je sais que les ombres douces ne sont pas sockets en charge par l’UILabel, sur l’iPhone. Alors, quelle serait la meilleure façon de mettre en œuvre mon propre?

MODIFIER:

Evidemment, je vais sous- UILabel et dessiner dans le fichier -drawRect: Ma question est la suivante: comment puis-je obtenir le contenu de l’étiquette sous forme de graphique et dessiner autour d’eux, les rendre flous, 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’append facilement une ombre douce à une étiquette et d’ajuster son rayon, 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 un code pour dessiner une ombre floue derrière une étiquette UIL. L’auteur utilise CGContextSetShadow () pour générer l’ombre du texte dessiné.

A partir de 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); 

Importez et jouez avec certains parameters:

 label.layer.shadowRadius = 3.0; label.layer.shadowOpacity = 0.5; 

Et si vous trouvez que votre ombre est tronquée par les limites de l’étiquette:

 label.layer.masksToBounds = NO; 

enfin mis

 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: Pour certaines raisons, 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 un texte blanc et je voulais “surligner” le texte en utilisant une lueur noire. Cela n’a pas fonctionné jusqu’à ce que je définisse cette propriété.

Appliquez l’ombre (douce) sur le calque de la vue, 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:

Importer le framework QuartzCore

 import QuartzCore 

Et définissez les atsortingbuts 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 

J’ai essayé presque toutes ces techniques (à l’exception de FXLabel) et je n’ai pu les utiliser avec iOS 7. J’ai finalement trouvé THLabel qui fonctionne parfaitement pour moi. J’ai utilisé THLabel dans Interface Builder et configuré les atsortingbuts d’exécution définis par l’utilisateur afin qu’il soit facile pour un non-programmeur de contrôler l’apparence.

https://github.com/MuscleRumble/THLabel

C’est comme un tour,

 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; 
 _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 la [couleur UIColorWithWhite: 0 alpha: 0.2] pour définir la valeur alpha.

J’ai écrit une bibliothèque qui fournit une sous-classe UILabel avec prise en charge des ombres douces et un tas d’autres effets:

https://github.com/nicklockwood/FXLabel

Sous-classe UILabel, comme indiqué, alors dans drawRect :, do [self drawTextInRect:rect]; pour faire entrer le texte 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 scope avec ce que vous venez de dessiner dans le contexte, vous devriez pouvoir utiliser:

 CGContextSetShadowWithColor() 

Regardez cette fonction dans les docs pour apprendre à l’utiliser.

À partir d’iOS 5, Apple fournit une méthode d’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 l’animation du défilement ne ralentit pas.

Ceci n’est utile que pour les applications non-App Store (évidemment) et vous avez besoin du fichier d’en-tête.

 $SBBulletinBlurredShadowLabel = NSClassFromSsortingng("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]; 

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

Sous-classe UILabel et substitut -drawInRect: