54 votes

Ombre portée sur le texte UITextField

Est-il possible d'ajouter une ombre au texte dans un UITextField ?

176voto

egarc Points 1311

À partir de la version 3.2, vous pouvez utiliser les propriétés d'ombre de CALayer.

 _textField.layer.shadowOpacity = 1.0;   
_textField.layer.shadowRadius = 0.0;
_textField.layer.shadowColor = [UIColor blackColor].CGColor;
_textField.layer.shadowOffset = CGSizeMake(0.0, -1.0);
 

73voto

deanWombourne Points 26066

J'ai un problème un peu différent - je veux un flou de l'ombre sur un UILabel. Heureusement, la solution à ce qui s'est avéré être le numéro (2) de Tyler

Voici mon code :

- (void) drawTextInRect:(CGRect)rect {
    CGSize myShadowOffset = CGSizeMake(4, -4);
    float myColorValues[] = {0, 0, 0, .8};

    CGContextRef myContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(myContext);

    CGColorSpaceRef myColorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef myColor = CGColorCreate(myColorSpace, myColorValues);
    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor);

    [super drawTextInRect:rect];

    CGColorRelease(myColor);
    CGColorSpaceRelease(myColorSpace); 

    CGContextRestoreGState(myContext);
}

C'est dans une classe qui étend la classe de UILabel et dessine le texte avec une ombre vers le bas et vers la droite 4px, l'ombre est gris à 80% d'opacité et est sightly floue.

Je pense que Tyler est la solution numéro 2 est un peu mieux pour les performances que Tyler est le numéro 1 - vous êtes seul face à un UILabel dans la vue et, en supposant que vous n'êtes pas redessiner chaque image, ce n'est pas un hit dans les performances de rendu sur une normale UILabel.

PS Ce code emprunté de l' Quartz 2D de la documentation

19voto

Tyler Points 16516

Je ne pense pas que vous obtenir une prise en charge intégrée pour le texte des ombres ici, la façon dont vous le faites avec d' UILabel.

Deux idées:

(1) [Moyennement difficile de code.] Ajouter un second UITextField derrière l'original, à un très petit décalage (peut-être par (0.2,0.8)? ). Vous pouvez écouter chaque changement de texte clé-en-clé de la mise en œuvre de l' textField:shouldChangeCharactersInRange:replacementString: méthode UITextFieldDelegate protocole. En utilisant cela, vous pouvez mettre à jour le bas du texte simultanément. Vous pouvez également en faire la moindre texte (l'ombre de texte) gris, et même légèrement floue en utilisant le fait que très légèrement compensée texte rectangles apparaissent floues. Ajouté: Oh oui, n'oubliez pas de mettre le haut du champ de texte la couleur de fond d' [UIColor clearColor] si vous y allez avec cette idée.

(2) [Encore plus de plaisir à code.] Sous-classe UITextField et remplacer l' drawRect: méthode. Je n'ai pas fait cela avant, donc je vais oublier avant que cela dépend de ce qui est désigné méthode de dessin, et il se peut que vous ayez à remplacer une autre fonction de dessin, tels que l' drawTextInRect:, ce qui est spécifique à l' UITextField. Réglez maintenant le contexte de dessin pour dessiner des ombres via l' CGContextSetShadow fonctions, et appelez - [super drawRect:rect];. J'espère que ça fonctionne, dans le cas où l'original UITextField code efface le contexte de dessin à l'ombre de paramètres, que l'idée est arrosé, et vous aurez à écrire le code de dessin vous-même, qui, je l'anti-recommander en raison de tous les extras qui viennent avec UITextFields comme le copier-coller et kanji de saisie en Japonais.

16voto

cnotethegr8 Points 984

Bien que la méthode de l'application de l'ombre directement à l' UITextView de travail, c'est la mauvaise façon de le faire. Par l'ajout de l'ombre directement avec un arrière-plan clair et la couleur, tous les sous-vues obtiendrez l'ombre, même le curseur.

La méthode qui devrait être utilisée avec NSAttributedString.

NSMutableAttributedString* attString = [[NSMutableAttributedString alloc] initWithString:textView.text];
NSRange range = NSMakeRange(0, [attString length]);

[attString addAttribute:NSFontAttributeName value:textView.font range:range];
[attString addAttribute:NSForegroundColorAttributeName value:textView.textColor range:range];

NSShadow* shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor whiteColor];
shadow.shadowOffset = CGSizeMake(0.0f, 1.0f);
[attString addAttribute:NSShadowAttributeName value:shadow range:range];

textView.attributedText = attString;

Cependant textView.attributedText est pour iOS6. Si vous devez prendre en charge les versions antérieures, vous pouvez utiliser l'approche suivante. (N'oubliez pas d'ajouter #import <QuartzCore/QuartzCore.h>)

CALayer *textLayer = (CALayer *)[textView.layer.sublayers objectAtIndex:0];
textLayer.shadowColor = [UIColor whiteColor].CGColor;
textLayer.shadowOffset = CGSizeMake(0.0f, 1.0f);
textLayer.shadowOpacity = 1.0f;
textLayer.shadowRadius = 0.0f;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X