Управление позицией AutoCorrect View на iPhone

Есть ли способ управлять позицией автоматического правильного вида, который появляется при вводе UITextField?

По умолчанию он появляется всегда под текстовым полем. Однако в приложениях Apple, таких как SMS, они иногда появляются над текстовым полем.

Для текстовых полей, выровненных прямо над клавиатурой, автоматическое исправление блокируется клавиатурой и не используется.

Ответы

Ответ 1

Позиция подсказки автоматической коррекции определяется методом firstRect... протокола UITextInput. К сожалению, UITextField использует частный класс в качестве делегата для этого протокола, поэтому вы не можете подклассы и переопределять его.

Однако вы МОЖЕТЕ реализовать свою собственную замену UITextField, самостоятельно рисуя содержимое (например, с помощью CoreText), реализуйте свой собственный выбор и обработку лупы, а затем вы сможете повлиять на позицию подсказки автоматической коррекции. Хотя он всегда должен быть ниже отредактированного текста, поэтому вам придется по существу лежать на методе firstRect....

Короче говоря: это слишком много хлопот.

Ответ 2

Один из ответов, который он работал у меня, - использовать метод setInputAccessoryView для textview/textview. У меня есть панель инструментов, которая содержит textView. Если я устанавливаю панель инструментов в качестве входного вида просмотра текстового поля и устанавливаю значение NO clipsToBound на панели инструментов, я точно не знаю, почему, но воздушный шар появляется над клавиатурой

Ответ 3

Вот решение, использующее частные API, поскольку нет способов сделать это с помощью общедоступных API.

  • Охота через свойство -windows приложения, чтобы найти закрытое окно UITextEffectsWindow и выяснить его фрейм. Это клавиатура
  • Охотите через подпрограммы TextView, чтобы найти частный просмотр UIAutocorrectInlinePrompt. Это автокорректный пузырь.
  • Переместите это представление в отдельный вид оболочки (добавленный в TextView), а затем переместите этот вид оболочки таким образом, чтобы он находился над вышеупомянутым окном клавиатуры.

Использование swizzled layoutSubViews,

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

            }
        }

    }

}

}

Подробнее проверить.