在iPhone上控制自动更正视图位置

时间:2009-05-26 15:31:27

标签: iphone objective-c

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

默认情况下,它似乎始终显示在文本字段下方。但是在Apple的应用程序(如SMS)中,有时会出现在文本字段上方。

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

4 个答案:

答案 0 :(得分:1)

自动更正提示的位置由UITextInput协议的firstRect ...方法决定。不幸的是,UITextField使用私有类作为此协议的委托,因此您不能对其进行子类化和覆盖。

然而,您可以通过自己绘制内容(与CoreText一样)来实现您自己的UITextField替换,实现您自己的选择和放大镜处理,然后您将能够影响自动更正提示的位置。虽然它的设计始终低于编辑后的文本,但您必须基本上放在firstRect ...方法上。

长话短说:这太麻烦了。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下是使用私有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;
                }

            }
        }

    }

}

}

有关详情check

答案 3 :(得分:0)

在我的情况下,由于字体的前导(行距),自动更正视图的位置发生了变化。

因此,我尝试使用firstRect函数作为下面的代码将其上移至前导px。

class CustomTextView: UITextView {
    override var font: UIFont? {
        didSet {
            if let font = font {
                leadingFont = font.leading
            } else {
                leadingFont = 0
            }
        }
    }
    var leadingFont: CGFloat = 0

    override func firstRect(for range: UITextRange) -> CGRect {
        var newRect = super.firstRect(for: range)
        newRect.origin = CGPoint(x: newRect.origin.x, y: newRect.origin.y - leadingFont)
        print("newRect: \(newRect)")
        return newRect
    }
}

虽然它是UITextView,但是您可以使用UITextField做同样的事情