iphone - textfield swift 4
Sombra en el texto de UITextField (4)
¿Es posible agregar una sombra al texto en un UITextField
?
A partir de 3.2, puede utilizar las propiedades de sombra 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);
Aunque el método de aplicar la sombra directamente a la UITextView
funcionará, es la forma incorrecta de hacerlo. Al agregar la sombra directamente con un color de fondo claro, todas las subvistas obtendrán la sombra, incluso el cursor.
El enfoque que debe usarse es con 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;
Sin embargo, textView.attributedText es para iOS6. Si debe admitir versiones inferiores, puede utilizar el siguiente enfoque. (No olvide agregar #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;
No creo que tengas soporte integrado para las sombras de texto aquí, como lo haces con UILabel
.
Dos ideas:
(1) [Moderadamente difícil de codificar.] Agregue un segundo UITextField
detrás del original, con un desplazamiento muy pequeño (¿quizás por (0.2,0.8)?). Puede escuchar cada cambio de texto clave por clave implementando el textField:shouldChangeCharactersInRange:replacementString:
en el protocolo UITextFieldDelegate
. Usando eso, puedes actualizar el texto inferior simultáneamente. También puede hacer que el texto inferior (el texto sombreado) se vuelva gris, e incluso ligeramente borroso, ya que los rectángulos de texto con desplazamiento parcial aparecen borrosos. Agregado: Oh sí, no olvides establecer el color de fondo del campo de texto superior en [UIColor clearColor]
si vas con esta idea.
(2) [Aún más divertido de codificar.] Subclase UITextField
y anule el método drawRect:
. No he hecho esto antes, así que mencionaré de antemano que esto depende de que este sea el método de dibujo designado, y puede que tenga que anular otra función de dibujo, como drawTextInRect:
que es específica de UITextField
. Ahora configure el contexto de dibujo para dibujar sombras a través de las funciones CGContextSetShadow
, y llame a [super drawRect:rect];
. Es de esperar que funcione, en caso de que el código original de UITextField
los parámetros de la sombra del contexto de dibujo, esa idea se difunda y tendrá que escribir usted mismo el código completo del dibujo, el cual no recomiendo debido a todos los extras que vienen con UITextFields
como copiar y pegar y kanji en japonés.
Tengo un problema ligeramente diferente: quiero una sombra borrosa en una UILabel. Afortunadamente, la solución a esto resultó ser el número (2) de Tyler
Aquí está mi código:
- (void) drawTextInRect:(CGRect)rect {
CGSize myShadowOffset = CGSizeMake(4, -4);
CGFloat 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);
}
Esto se encuentra en una clase que se extiende desde UILabel y dibuja el texto con una sombra hacia abajo y hacia la derecha 4px, la sombra es gris a 80% de opacidad y está borrosa.
Creo que la solución número 2 de Tyler es un poco mejor para el rendimiento que la número 1 de Tyler: solo estás tratando con un UILabel en la vista y, asumiendo que no estás redibujando cada cuadro, no es un éxito en el rendimiento de renderizado en un UILabel normal.
PS Este código tomó mucho de la documentación de Quartz 2D