Objective c 自定义文本字段–;镜像自动更正

Objective c 自定义文本字段–;镜像自动更正,objective-c,ios,core-text,uikeyboard,uitextinput,Objective C,Ios,Core Text,Uikeyboard,Uitextinput,我正在使用CoreText实现一个自定义UITextView(基于EGOTextView),并遵守协议。除了一件烦人的事外,我几乎所有的东西都工作得很好。“自动更正建议”文本垂直镜像,其突出显示略微向右移动。下面是它的样子: 在文本字段中,我输入了“helo”,它会自动更正为“help”。如您所见,自动更正的文本(而不是其背景)是垂直镜像的。此外,它的水平偏移量向右偏移约7磅 为了解决第二个问题(水平偏移),我已经验证了firstRectForRange:方法返回正确的CGRect。我用两种方

我正在使用CoreText实现一个自定义UITextView(基于EGOTextView),并遵守协议。除了一件烦人的事外,我几乎所有的东西都工作得很好。“自动更正建议”文本垂直镜像,其突出显示略微向右移动。下面是它的样子:

在文本字段中,我输入了“helo”,它会自动更正为“help”。如您所见,自动更正的文本(而不是其背景)是垂直镜像的。此外,它的水平偏移量向右偏移约7磅

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

如您所见,正确的区域被勾勒出来,但自动更正被错误地标记/突出显示

我很乐意分享任何代码,但这是一个庞大的类,我现在非常困惑。任何指点都将不胜感激


编辑:源代码可在此存储库的实验分支上获得:。

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

- (UIView *)textInputView {
    return _textContentView;
}
有关更多帮助,请参阅(这通常是UIT类的实例)。 如果您想保持这个方法的实现,只需从中返回self,因为这里的self(EGOTextView)是uit类的一个实例

我在我这边试过,效果很好

@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的图层几何体翻转时,没有上述代码也可以,但文字是颠倒的。
因此,我猜系统会变得“混乱”(可能是一个bug?),因为它会检查EGOTextView的图层的几何图形是否翻转,并基于此调整UIAutocorrectInlinePrompt的几何图形。但事实上,EGOContentView的几何体并不是EGOTextView的,UIAutocorrectInlinePrompt视图是EGOContentView的子视图,但由于它是根据EGOContentView的superview层进行“调整”的,所以它最终是颠倒的

由于我不知道您是如何执行这些操作的,请记住,使用
UIKit
,图形原点位于左上角(y向下增加)。但较低级别的绘图函数的原点位于左下角(y向上递增)。您的解决方案可能是应用(1,-1)的缩放变换来翻转y轴。@rmaddy,谢谢。这确实是它看起来的样子,但我不知道我哪里出错了,为什么我的代码甚至会影响自动更正视图的绘制,这不是我绘制的。我继续制作了github repo,您可以在编辑中看到。