Управление позицией 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;
}
}
}
}
}
}
Подробнее проверить.