UITextField – (void) drawPlaceholderInRect: (CGRect) rect devuelve diferente altura CGRect en iOS 7

Intenté subclassar UITextField para dibujar placehoder personalizado. En iOS 6 esto funciona bien, pero en iOS 7 obtuve una altura de CGRect diferente.

La ttwig UITextField es (0, 0, 500, 45) . - (CGRect)editingRectForBounds:(CGRect)bounds; un relleno izquierdo de 20 sobrescribiendo - (CGRect)editingRectForBounds:(CGRect)bounds;

- (CGRect)placeholderRectForBounds:(CGRect)bounds;

- (CGRect)textRectForBounds:(CGRect)bounds;

Llamar al siguiente método para hacerlo:

 - (CGRect)makeRectFromBounds:(CGRect)bounds withTopPadding:(CGFloat)topPadding andLeftPadding:(CGFloat)leftPadding { return UIEdgeInsetsInsetRect(bounds, UIEdgeInsetsMake(topPadding, leftPadding, 0, 0)); } 

Porque quiero un color de text de lugar Holder diferente, anulo

- (void)drawPlaceholderInRect:(CGRect)rect

 - (void)drawPlaceholderInRect:(CGRect)rect { [[UIColor colorWithRed:121.0/255.0 green:113.0/255.0 blue:107.0/255.0 alpha:1.0] setFill]; [self printRect:rect from:__FUNCTION__]; [[self placeholder] drawInRect:rect withFont:self.font]; } 

El rectángulo que estoy imprimiendo es el siguiente:

 iOS 7: -Rect (X: 0.0, Y:0.0, W:480.0, H:44.0) iOS 6: -Rect (X: 0.0, Y:0.0, W:480.0, H:26.0) 

¿Alguna idea si esto es un error o estoy haciendo algo mal?

Use lo siguiente:

 [textfield setValue:[UIColor networkingColor] forKeyPath:@"_placeholderLabel.textColor"]; 

En iOS 7, el valor pnetworkingeterminado para contentVerticalAlignment cambió de "arriba" a "centro" (sin documentation que pudiera ver). En el modo "centro" iOS ajusta el resultado de los methods rectForBounds antes de dibujar en ellos. Probablemente deberías configurar contentVerticalAlignment = UIControlContentVerticalAlignmentTop al anular cualquier método textRectForBounds para que iOS use el rect exactamente como se especifica.

Dado que iOS7 es nuevo hoy en día, muchas personas se enfrentan a problemas de encuadre con iOS7.

A todos ellos, solo quiero decir que es tan fácil y que no hay ningún problema con iOS7. Es solo porque no sabes cómo aprovechar los beneficios de la última característica del sistema operativo proporcionada por Apple.

@Cyupa: solo necesitas aplicar autofiguración y enmascarar tu campo de text.

podría ser uno o más de seguir.

  • UIViewAutoresizingFlexibleBottomMargin
  • UIViewAutoresizingFlexibleTopMargin
  • UIViewAutoresizingFlexibleLeftMargin
  • UIViewAutoresizingFlexibleRightMargin
  • UIViewAutoresizingFlexibleHeight
  • UIViewAutoresizingFlexibleWidth

si aplica una máscara de autocoplaje adecuada a su campo de text, obtendrá el marco deseado para su vista (Aquí campo de text)

También encontré este problema, aún no se ha encontrado el motivo, pero si quieres tener el mismo comportamiento tanto en iOS6 como en iOS7, puedes probar esto:

 - (CGRect)textRectForBounds:(CGRect)bounds { CGRect rect = [super textRectForBounds:bounds]; rect = CGRectMake(20, rect.origin.y-4, rect.size.width-20, rect.size.height); return rect; } 

y es posible que necesite configurar:

 theLabel.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter; 

verifique la versión del sistema y devuelva UIEdgeInsetsInsetRect(bounds, UIEdgeInsetsMake(topPadding, leftPadding, 0, 0));

puedes verificar la versión del dispositivo como

 if(([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0)) { } 

solucioné el problema al usar esta propiedad

 textField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter; 

Funciona tanto para iOS6 como para iOS7.

La solución de Ricky me funcionó con la adición de este valor que debe establecerse cada vez DESPUÉS del cambio de text de marcador de position. Sobreescribí setPlaceholder para hacer eso.

Reemplaza la necesidad de sobrescribir drawPlaceholderInRect, si quiere otro color de marcador de position, por lo tanto, la alignment vertical será correcta automáticamente. Por supuesto, esto no responde a la pregunta, por qué IOS 7.0 se comporta así, pero podría resolver su problema real.

 - (void) setPlaceholder: (NSString*)placeholderText { [super setPlaceholder:placeholderText]; [self setValue:[UIColor networkingColor] forKeyPath:@"_placeholderLabel.textColor"]; } 

Debería mencionarse que algunas personas desalientan esta omisión de las interfaces públicas, ¡así que háganlo bajo su propio riesgo! Véase también: Cambiar el color del text del marcador de position de UITextField mediante progtwigción