自定义文本字段 - 镜像自动更正

时间:2012-11-15 00:10:56

标签: objective-c ios core-text uikeyboard uitextinput

我正在使用CoreText实现自定义UITextView(基于EGOTextView)并符合UITextInput协议。我几乎一切都工作得很好(p!),除了一件烦人的事情。自动更正建议文本垂直镜像,其突出显示略微向右移动。这是它的样子:

Mirrored autocorrection

在文本字段中,我输入了“helo”,它自动修正为“help”。如您所见,自动更正文本(而非背景)是垂直镜像的。此外,它正在向右偏移~7pt。

为解决第二个问题(水平偏移),我已验证firstRectForRange:方法返回正确的CGRect。我已经用两种方式做到了这一点。第一个是目测检查当我显示UIMenuController时,它显示在正确的位置(确实如此)。第二个是围绕CGRect返回的firstRectForRange:绘制轮廓。这是与CGRect概述的相同文本。

Outlined CGRect

如您所见,概述了正确的区域,但自动更正标记/突出显示不正确。

我很高兴分享任何代码,但这是一个庞大的课程,我现在很难过。任何指针都会受到大力赞赏!

编辑:此存储库的Experimental分支上提供了源代码:github.com/cbrauchli/EGOTextView

2 个答案:

答案 0 :(得分:1)

我在尝试你的代码时遇到了同样的问题,我发现没有必要实现

- (UIView *)textInputView {
    return _textContentView;
}

请参阅Apple documentation(这通常是UITextInput采用类的一个实例。)以获取更多帮助。 如果你想继续实现这个方法,只需要return self,因为这里self (EGOTextView)是UITextInput采用类的一个实例。

我在最后尝试了这个并且工作正常。

答案 1 :(得分:1)

@implementation EGOContentView

@synthesize delegate=_delegate;

- (id)initWithFrame:(CGRect)frame {...}

添加:

- (void)addSubview:(UIView *)view
{
    if([view isKindOfClass:NSClassFromString(@"UIAutocorrectInlinePrompt")])
    {
        view.layer.geometryFlipped = !view.layer.geometryFlipped;
    }
    [super addSubview:view];
}

我要说的只是猜测。 当翻转EGOTextView的图层的几何图形时没有上面的代码就可以了,但是文本是颠倒的。 所以我的猜测是系统变得“混乱”(可能是一个错误?)因为它会检查EGOTextView的图层几何体是否被翻转并根据它调整UIAutocorrectInlinePrompt的几何图形。但实际上EGOContentView的几何图形不是EGOTextView的翻转,而UIAutocorrectInlinePrompt视图是EGOContentView的子视图,但由于它是基于EGOContentView的superview图层进行“调整”的,所以它最终颠倒了。