2012-11-15 23 views
3

我正在實現使用CoreText並遵循UITextInput協議的自定義UITextView(基於EGOTextView)。我幾乎一切工作正常(唷!),除了一件煩人的事情。自動更正建議文本是垂直鏡像的,其高亮稍微向右移動。這裏是什麼樣子:「幫助」自定義文本字段 - 鏡像自動更正

Mirrored autocorrection

在文本字段我輸入「直升機」,它autocorrects到正如你所看到的,自動更正的文本,但不是它的背景,是垂直鏡像的。另外,它橫盤右移約7點。

要解決第二個問題(水平偏移),我已驗證firstRectForRange:方法返回正確的CGRect。我以兩種方式做到了這一點。第一個是目視檢查,當我顯示UIMenuController時,它顯示在正確的位置(它確實)。第二個是圍繞由firstRectForRange:返回的CGRect繪製輪廓。這裏有與CGRect概述相同的文字。

Outlined CGRect

正如你所看到的,正確的區域概述,但自動更正標/高亮顯示不正確。

我很高興分享任何代碼,但這是一個巨大的課程,我現在很難過。任何指針都會被大量讚賞!

編輯:源代碼可在此存儲庫的Experimental分支上找到:github.com/cbrauchli/EGOTextView

+0

因爲我不知道你是怎麼做的,所以請記住,使用'UIKit',繪圖原點位於左上角(y增加)。但是較低級別的繪圖函數的起點在左下角(y越來越大)。您的解決方案可能是應用(1,-1)的縮放變換來翻轉y軸。 – rmaddy

+0

@rmaddy,謝謝。這絕對是它的樣子,但我無法弄清楚我出錯的地方,以及爲什麼我的代碼甚至會影響自動更正視圖的繪製,而這並不是由我繪製的。我繼續做了github回購,你可以在編輯中看到。 – cbrauchli

回答

1

試圖你的代碼我ASLO面臨着同樣的同樣的問題,我發現,沒有必要實施

- (UIView *)textInputView { 
    return _textContentView; 
} 

Apple documentation(這通常是UITextInput,採用類的實例。)以獲得更多幫助在上面。 如果你想繼續執行這個方法,只需要return self,因爲這裏的self (EGOTextView)是UITextInput採用類的一個實例。

我在我的最後嘗試了這個,並且工作正常。

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的超視圖層「調整」的,所以它會顛倒過來。