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.
Urto! Qualche risposta dopo 1 anno? –
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