首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制iPhone上的AutoCorrect视图位置

控制iPhone上的AutoCorrect视图位置
EN

Stack Overflow用户
提问于 2009-05-26 15:31:27
回答 4查看 2.1K关注 0票数 13

有没有办法控制在输入UITextField时弹出的自动更正视图的位置

默认情况下,它始终显示在文本字段的下方。然而,在像SMS这样的苹果应用程序中,它有时会出现在文本字段的上方。

对于在键盘正上方对齐的文本字段,键盘会阻止自动更正,因此无法使用。

EN

回答 4

Stack Overflow用户

发布于 2011-06-18 18:16:26

自动更正提示的位置由firstRect...UITextInput协议的方法。不幸的是,UITextField使用私有类作为这个协议的委托,所以你不能子类化和覆盖它。

但是,您可以通过自己绘制内容来实现自己的UITextField替换(如使用CoreText),实现自己的选择和放大镜处理,然后您将能够影响自动更正提示的位置。虽然它被设计成总是在编辑后的文本下面,所以你实际上必须躺在firstRect上……方法。

长话短说:这太麻烦了。

票数 1
EN

Stack Overflow用户

发布于 2012-06-21 19:25:06

它对我有效的一个答案是使用textview/textview的setInputAccessoryView方法。我有一个包含textView的工具栏。如果我将工具栏设置为文本字段的inputaccessoryview,并将工具栏的clipsToBound属性设置为NO,我不知道确切的原因,但气球出现在键盘上方

票数 0
EN

Stack Overflow用户

发布于 2012-11-06 12:21:57

这是一个使用私有API的解决方案,因为没有办法使用公共API来实现此目的。

  • 搜索应用程序的-windows属性以查找私有UITextEffectsWindow窗口并确定其框架。这是键盘
  • 通过TextView的子视图查找私有UIAutocorrectInlinePrompt视图。这是自动更正气泡。
  • 将该子视图移动到单独的包装视图中(添加到TextView中),然后移动该包装视图,使其位于上述键盘窗口的上方。

使用swizzled

代码语言:javascript
复制
- (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;
                }

            }
        }

    }

}

}

有关更多详细信息,请访问check

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/911323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档