Управление автозаменой положения просмотра на iPhone - PullRequest
13 голосов
/ 26 мая 2009

Есть ли способ управления положением автокоррекции, которая появляется при наборе UITextField?

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

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

Ответы [ 3 ]

1 голос
/ 18 июня 2011

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

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

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

0 голосов
/ 06 ноября 2012

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

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

Использование макета 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;
                }

            }
        }

    }

}

}

Для более подробной информации проверьте .

0 голосов
/ 21 июня 2012

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

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