2009-05-26 15 views
13

¿Hay alguna forma de controlar la posición de la vista correcta automáticamente que aparece al escribir en un UITextField?Controlar la posición de visualización de autocorrección en el iPhone

Por defecto parece que siempre aparece debajo del campo de texto. Sin embargo, en las aplicaciones de Apple, como SMS, a veces aparece sobre el campo de texto.

Para los campos de texto alineados justo encima del teclado, la autocorrección está bloqueada por el teclado y no se puede utilizar.

+0

Bump! ¿Alguna respuesta después de 1 año? –

+0

técnicamente no es posible, y no hay una API pública que permita hacer esto. Sin embargo, uno puede modificar la posición de la ventana emergente de corrección: la ventana emergente es una subvista del área de texto y, por lo tanto, puede encontrarse al recorrer las subvistas. Puedes encontrar su posición original y moverla a donde sea. Ponga esta lógica en un método y llámelo cada vez que se llame a "layoutSubviews" del campo de texto ... Todavía no veo una solución más limpia – Nick

Respuesta

1

La posición de la solicitud de corrección automática está determinada por el método firstRect ... del protocolo UITextInput. Lamentablemente, UITextField utiliza una clase privada como delegado para este protocolo, por lo que no puede subclasificar ni anular.

Sin embargo, PODRÍA implementar su propia sustitución UITextField dibujando los contenidos usted mismo (como con CoreText), implemente su propia selección y manejo de la lupa y luego podría afectar la posición de la solicitud de corrección automática. Aunque está diseñado para estar siempre por debajo del texto editado, por lo que tendrías que descansar esencialmente en el método firstRect ...

Resumen de la historia larga: es demasiada molestia.

0

Una respuesta que funcionó para mí es utilizar el método setInputAccessoryView de la vista de texto/vista de texto. Tengo una barra de herramientas que contiene textView. Si configuro la barra de herramientas como inputaccessoryview del campo de texto, y configuro NO propiedad clipsToBound de la barra de herramientas, no sé exactamente por qué, pero el globo aparece sobre el teclado

+0

¿Ha sido capaz de descubrir cómo hacerlo aparecer ... sobre el campo? siendo editado en lugar de debajo ?. ¡Gracias! –

0

Aquí hay una solución que usa API privadas como no hay formas de hacerlo utilizando API públicas.

  • Busque en la propiedad de Windows de la aplicación la ventana privada de UITextEffectsWindow y descubra su marco. Este es el teclado
  • Busque en las subvistas de TextView para encontrar la vista privada UIAutocorrectInlinePrompt. Esta es la burbuja de autocorrección.
  • Mueva esa subvista en una vista de contenedor separada (agregada a TextView) y luego mueva esa vista de contenedor para que esté encima de la ventana del teclado mencionada anteriormente.

Usando layoutSubViews swizzled,

- (void) moveSpellingCorrection { 
for (UIView *view in self.subviews) 
{ 
    if ([[[view class] description] isEqualToString:@"UIAutocorrectInlinePrompt"]) 
    { 
     UIView *correctionShadowView = nil; // [view correctionShadowView]; 

     for (UIView *subview in view.subviews) 
     { 
      if ([[[subview class] description] isEqualToString:@"UIAutocorrectShadowView"]) 
      { 
       correctionShadowView = subview; 
       break; 
      } 
     } 

     if (correctionShadowView) 
     { 
      UIView *typedTextView = nil; //[view typedTextView]; 
      UIView *correctionView = nil; //[view correctionView]; 

      for (UIView *subview in view.subviews) 
      { 
       if ([[[subview class] description] isEqualToString:@"UIAutocorrectTextView"]) 
       { 
        if (CGRectContainsRect(correctionShadowView.frame,subview.frame)) 
        { 
         correctionView = subview; 
        } 
        else 
        { 
         typedTextView = subview; 
        } 
       } 

      } 
      if (correctionView && typedTextView) 
      { 

       CGRect textRect = [typedTextView frame]; 
       CGRect correctionRect = [correctionView frame]; 
       if (textRect.origin.y < correctionRect.origin.y) 
       { 
        CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0,-50.0); 
        [correctionView setTransform: moveUp]; 
        [correctionShadowView setTransform: moveUp]; 

        CGRect windowPos = [self convertRect: view.frame toView: nil ]; 
        [view removeFromSuperview]; 
        [self.window addSubview: view]; 
        view.frame = windowPos; 
       } 

      } 
     } 

    } 

} 

}

Para más detalles check.

Cuestiones relacionadas