por inicio home flotante desactivar control como boton assistive iphone objective-c ios xcode uitextfield

inicio - como desactivar el boton home del iphone



El texto en UITextField se mueve después de la edición(centro al editar) (12)

Tengo un problema extraño. Tengo un UITextField en el que el usuario debe escribir la cantidad de algo, por lo que el campo se llama "amountField". Todo se ve bien, cuando el usuario comienza a editar el campo de texto, el texto está en el centro vertical y horizontal, eso es genial.

Sin embargo, cuando el usuario finaliza la edición, el texto se mueve un poco. Intenté muchas cosas, nada me ayudó ...

Estoy agregando capturas de pantalla a continuación, para que pueda ver cuál es el problema.

Esto es lo que parece al editar el campo, está bien.

Y así es como se ve cuando se realiza la edición: ¡ese es el problema !

Por favor, si alguien sabe lo que podría causar esto, ¡estaría muy agradecido! :)

Aquí hay algunos de mis códigos relacionados con el amountField.

amountField.keyboardType = UIKeyboardTypeNumberPad; amountField.returnKeyType = UIReturnKeyDone; amountField.delegate = self; [amountField setFont:[UIFont fontWithName:@"Nuptial Script LT Std" size:30]]; amountField.borderStyle = UITextBorderStyleNone; UIImage *amountBg = [UIImage imageNamed:@"skin2_ipad_amountField.png"]; [amountField setBackground:amountBg]; amountField.rightView = nil; //amountField.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2]; amountField.textAlignment = UITextAlignmentCenter; amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; amountField.adjustsFontSizeToFitWidth = YES; amountLabel.textColor = UIColorFromARGB(0x313030); //Using my own macro amountField.frame = CGRectMake(300, 480, 136, 32); amountField.center = CGPointMake(605, 439);

PD: Esas esquinas blancas están ahí porque puse el fondo en blanco con 0.2 alfa, eso está bien.


Compruebe el teclado para cambiar la vista de la posición de la self.view.layoutIfNeeded() emergente si hay línea de código self.view.layoutIfNeeded() Eliminar it.Good Luck!


Esto se debe a que el BaselineOffset para el campo de texto cambió. En UITextFieldDidEndEditing crear un texto atribuido con NSBaselineOffset: 0 y usar ese attributedText solucionaría el problema.

-(IBAction)txtFieldDidEndEditing:(UITextField *)sender { NSDictionary *style = @{ NSBaselineOffsetAttributeName: @(0) }; self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style]; }


No pude cambiar el archivo de fuente, así que cuando resolví esto, guardé el cuadro original de UITextField en una propiedad y apliqué el siguiente código:

- (void)textFieldDidBeginEditing:(UITextField *)textField { textField.frame = self.usernameFrame; } - (void)textFieldDidEndEditing:(UITextField *)textField { textField.frame = CGRectOffset(self.usernameFrame, 0, 1); }

Es un poco raro, pero hace el trabajo bien.


Asi que...

Después de muchas horas de probar muchas cosas, he encontrado el problema. En mi caso, el problema es la fuente. Realmente no sé por qué, pero el autor de la fuente hizo que la fuente sea extraña (por ejemplo, etc.), tiene un espacio en blanco en la parte inferior. No sé por qué, pero cuando edita el texto, se ignoran todas las propiedades del texto, pero una vez que termina la edición, se aplican.

Entonces, si tiene un problema similar, intente cambiar la fuente a Arial o algo similar.

Para una explicación completa, por favor consulte estos enlaces: enlace 1 y enlace 2 . La solución recomendada en estos enlaces puede evitarle muchos dolores de cabeza e incluso puede aplicarse para corregir problemas como el texto que se mueve hacia arriba cuando comienza a editar un UITextField (usando la fuente del sistema u otras fuentes particulares).


Estoy luchando con este problema casi todo el tiempo cuando el diseño de la aplicación es con una fuente personalizada. Una opción es arreglar la fuente (pero esto es demasiado trabajo, al menos para mí :)). La segunda opción que estoy usando es subclasificar el UITextField y reemplazar los métodos editingRectForBounds: y placeholderRectForBounds: y corregir el desplazamiento. Debería funcionar para su caso también.

@implementation MyTextFieldWithFixedFontPosition -(CGRect)editingRectForBounds:(CGRect)bounds{ return CGRectOffset([self textRectForBounds:bounds], 0, 0.5); //0.5 is just example, you can adjust to any offset you like } -(CGRect)placeholderRectForBounds:(CGRect)bounds{ return [self editingRectForBounds:bounds]; } @end

No lo he probado con leftView o rightView, así que ten cuidado al usar estos :)

NOTA: este enfoque es "dependiente de la fuente", los valores utilizados para la compensación pueden variar para cada fuente y tamaño


Existe un error en iOS 8.1 y versiones posteriores, no sé si lo arreglarán más adelante, pero en ese momento no existe una solución única que corrija todos los casos, ya que el error y las soluciones son del tipo de fuente, dependiendo del tamaño.

Una de estas soluciones o una combinación de estas soluciones a continuación puede solucionar su problema:

  • Cambiando el tamaño de la fuente.

  • Cambiando el tipo de letra.

  • Cambiar el tamaño de UITextField.

  • Descompilar la fuente en cuestión, modificar las características de la fuente y volver a compilarla (para obtener más información, consulte los siguientes enlaces: enlace 1 y enlace 2 ).

De lo contrario, esta otra solución autosuficiente a continuación puede solucionar su problema:

Versión Swift

import UIKit class CustomTextField: UITextField { ... override func textRectForBounds(bounds: CGRect) -> CGRect { // Possible values. return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) } override func editingRectForBounds(bounds: CGRect) -> CGRect { // Possible values. return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) } override func placeholderRectForBounds(bounds: CGRect) -> CGRect { // Possible values. return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) } }

Esta solución ha sido probada con leftView y funciona como un encanto.

NOTA: este enfoque es "dependiente de la fuente", los valores utilizados para CGRectInset pueden variar para cada fuente y tamaño.


Tuve un problema similar que comenzó a suceder en iOS 9 . Básicamente tengo un UITextField en una celda de vista de colección. A veces, cuando el usuario termina de escribir y termina la edición, el texto "rebota" hacia arriba y hacia abajo nuevamente a su posición correcta. Muy extraño y molesto error. Simplemente hacer este ajuste solucionó el problema en iOS 9 y demostró ser seguro en iOS 7 y 8:

- (void)textFieldDidEndEditing:(UITextField *)textField { [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch //...other stuff }


Tuve problemas similares con un UITextfield incrustado en una UITableViewCell . ¿Dónde se encuentra exactamente este código en su proyecto? Lo que creo que está sucediendo es que después de que hayas terminado de editar un campo de texto en particular, se envía a sí mismo -setNeedsDisplay y su drawRect: se llama posteriormente. Esto podría explicar el cambio en la alineación. En mi caso particular, tuve que usar un método delegado de vista de tabla -willDisplayCell ... para establecer la alineación del contenido. Tendría que saber más acerca de su diseño para posiblemente ofrecer una sugerencia.

Una posible solución sería utilizar los métodos de delegado de campo de texto para establecer la alineación del contenido.

-(void)textFieldDidEndEditing:(UITextField *)textField{ if (amountField == textField){ amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; } }


Lo arreglé agregando restricciones de altura a mis UITextFields.


Este error me sucedió cuando establecí el texto y me convertí en el primer respondedor en viewDidLoad o viewWillAppear . Cuando moví el código de viewDidAppear a viewDidAppear el error desapareció.


Desactivar ClipsToBounds para el TextField me lo resolvió.


Esta solución anterior no funciona para mí. Mi solución es la subclase UITextField y anula setText:

- (void) setText:(NSString *)text { [super setText:text]; [self layoutIfNeeded]; }