2009-05-26 12 views
13

C'è un modo per controllare la posizione della vista automatica corretta che si apre digitando in un UITextField?Controllo della posizione della vista di correzione automatica su iPhone

Per impostazione predefinita, appare sempre sotto il campo di testo. Tuttavia nelle app di Apple come gli SMS a volte appare sopra il campo di testo.

Per i campi di testo allineati sopra la tastiera, la correzione automatica è bloccata dalla tastiera e non utilizzabile.

+0

Urto! Qualche risposta dopo 1 anno? –

+0

tecnicamente non è possibile, e non ci sono API pubbliche che permettano di farlo. Tuttavia, si può modificare la posizione del popup di correzione: il popup è una sottoview dell'area di testo, e quindi può essere trovato iterando attraverso le sottoview. Puoi trovare la sua posizione originale e spostarla ovunque. Metti questa logica in un metodo e chiamala ogni volta che viene chiamato "layoutSubviews" del campo di testo ... Devo ancora vedere una soluzione più pulita – Nick

risposta

1

La posizione del prompt di correzione automatica è determinata dal metodo firstRect ... del protocollo UITextInput. Sfortunatamente, UITextField utilizza una classe privata come delegato per questo protocollo in modo da non poter eseguire la sottoclasse e sovrascriverla.

POTREBBE tuttavia implementare la propria sostituzione di UITextField disegnando il contenuto da soli (come con CoreText), implementare la propria selezione e la gestione della lente e quindi si sarebbe in grado di influenzare la posizione del prompt di correzione automatica. Sebbene sia progettato per essere sempre al di sotto del testo modificato, quindi dovresti essenzialmente mentire sul metodo firstRect ....

Per farla breve: è troppo fastidio.

0

Una risposta ha funzionato per me è utilizzare il metodo setInputAccessoryView di textview/textview. Ho una barra degli strumenti che contiene il textView. Se si imposta la barra degli strumenti come proprietà di input del campo di testo e non si imposta esattamente la proprietà ClipToBound della barra degli strumenti, non so esattamente perché, ma il fumetto appare sopra la tastiera

+0

Sei riuscito a capire come farlo apparire ... sopra il campo in corso di modifica anziché in basso ?. Grazie! –

0

Ecco una soluzione che utilizza API private come non ci sono modi per farlo usando le API pubbliche.

  • Cercare la proprietà -windows dell'applicazione per trovare la finestra UITextEffectsWindow privata e individuare la sua cornice. Questa è la tastiera
  • Cerca nelle sottoview di TextView per trovare la vista UIAutocorrectInlinePrompt privata. Questa è la bolla di correzione automatica.
  • Spostare la visualizzazione secondaria in una vista wrapper separata (aggiunta a TextView) e quindi spostare la vista di wrapper in modo che si trovi sopra la suddetta finestra della tastiera.

Utilizzando 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; 
       } 

      } 
     } 

    } 

} 

}

Per maggiori dettagli check.

Problemi correlati