2011-12-25 60 views
1

我正在使用- (void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag更改插入符號大小。無論如何,當我移動選擇時,脫字符號會暫時變回其默認大小。NSTextView插入符號大小有時會被忽略

是否有另一種方法繪製了我需要覆蓋的脫字符?

什麼我目前在做

- (void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag { 

    aRect.origin.y -= 1; 
    aRect.origin.x -= 1; 
    aRect.size.width += 1; 
    aRect.size.height += 1; 

    [super drawInsertionPointInRect:aRect color:aColor turnedOn:flag]; 

} 

回答

2

原來的答案:

如果你不這樣做已經,子類NSTextView然後實現drawInsertionPointInRect:color:turnedOn:方法自己做花哨的意義吸引你自己。

另外要注意這條線從文檔:

重點必須在接收器上調用此方法時被鎖定。 你不應該直接調用這個方法。

子類化是要走的路。

更多的應用程序特定的答案:

相反調入[super drawInsertionPointInRect...的,可考慮做所有的繪圖自己。

像這樣:

- (void)drawInsertionPointInRect:(NSRect)rect color:(NSColor *)color turnedOn:(BOOL)flag 
{ 
    //Block Cursor 
    if(flag) 
    { 
     NSPoint aPoint=NSMakePoint(rect.origin.x,rect.origin.y+rect.size.height/2); 
     int glyphIndex = [[self layoutManager] glyphIndexForPoint:aPoint inTextContainer:[self textContainer]]; 
     NSRect glyphRect = [[self layoutManager] boundingRectForGlyphRange:NSMakeRange(glyphIndex, 1) inTextContainer:[self textContainer]]; 

     [color set ]; 
     rect.size.width =rect.size.height/2; 
     if(glyphRect.size.width > 0 && glyphRect.size.width < rect.size.width) 
      rect.size.width=glyphRect.size.width; 
     NSRectFillUsingOperation(rect, NSCompositePlusDarker); 
    } else { 
     [self setNeedsDisplayInRect:[self visibleRect] avoidAdditionalLayout:NO]; 
    } 
} 

(該代碼對於這I stole from here

+0

對不起,我實際上正在實施該方法。我更新了這個問題。 (感謝您的回答) – Donovan 2011-12-25 11:52:34

+0

好吧...我編輯爲您添加另一個選項 – 2011-12-25 12:07:12

+0

是的,已經嘗試了代碼。當移動光標時,它將變回正常 – Donovan 2011-12-25 12:19:14

-1

看來,唯一的解決辦法是重寫無證方法- (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)color。不過,我希望有更好的解決方案。

+0

當其他人提供信息時,你認真對待自己? – uchuugaka 2016-12-05 08:21:26

+1

@uchuugaka你的意思是Michael的回答?老實說,我不明白爲什麼我創造了另一個答案,重複這個信息......很奇怪。謝謝你指出,但我。 – Donovan 2016-12-05 12:40:01

1

我有同樣的問題。 多諾萬的答案解決了這個問題,但是當我試圖畫出「透明」字樣時,我需要做更多的事情,並且我有一個解決方案。

我做了一個博客文章。 http://programming.jugglershu.net/wp/?p=765

答案爲「如何繪製厚的透明插入符號」是...

  • 在_drawInsertionPointInRect繪製透明插入符:通過調用setNeedsDisplay方法
  • 清除在drawInsertionPointInRect插入符。

我希望這可以幫助那些想要做同樣事情的人。