Est-il possible d'ajouter une ombre au texte dans un UITextField
?
Réponses
Trop de publicités?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
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.
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;