web-dev-qa-db-fra.com

iPhone UILabel texte ombre douce

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

59
Dimitris

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é.

19
Brad Larson

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
189
IlDan

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);
38
oksk

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é.

17
Stefan

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;
7
Yang Meyer

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
6
Sebastian Hojas
_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.

5
bigjava

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.

https://github.com/MuscleRumble/THLabel

4
Sean

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;
4
Nagarjun

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.

3
Tyler

J'ai écrit une bibliothèque qui fournit une sous-classe UILabel avec un support d'ombre douce et un tas d'autres effets:

https://github.com/nicklockwood/FXLabel

3
Nick Lockwood

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

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];
1
Sticktron