2013-03-26 4 views
8

ich die Einfügemarke Größe zu ändern, indem -(void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag überschreiben, aber es behandelt nicht die erste blinken (wenn Sie die Einfügemarke bewegen, geht es zurück zu normal)Individuelle Einfügemarke für NSTextView

ich es geschafft, Handle das erste Mal durch Überschreiben der privaten Methode - (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor.

Aber das ist keine Lösung für mich, da das Überschreiben der privaten Methode zu einem Rückgang durch App Store führt. Ich möchte, dass die App im App Store verfügbar ist. Ich sehe Apps wie iAWriter und Writeroom haben einen benutzerdefinierten Einfügepunkt und sie sind im App Store.

Weiß jemand, wie sie das geschafft haben, oder einen besseren Weg, anstatt die private Methode zu überschreiben?

Danke.

- (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor 
{ 
    aRect.size.width = 3.0; 
    [aColor set]; 
    [NSBezierPath fillRect:aRect]; 
} 

- (void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag 
{ 
    if(flag) { 
     aRect.size.width = 3.0; 
     [aColor set]; 
     [NSBezierPath fillRect:aRect]; 
    } 
    else { 
     [self setNeedsDisplayInRect:[self visibleRect] avoidAdditionalLayout:NO]; 
    } 
} 
+0

Haben Sie versucht, den Einfügepunktbereich zu löschen (füllen Sie mit Hintergrund, was auch immer), wenn Flag falsch ist? –

Antwort

0

ich App Store nicht, aber ich frage mich, ob dieser „tricky“ kleiner Hack einen undokumentierten Anruf fly unter Apples Radar lassen würde. Im Grunde haben Sie eine harmlos benannte Methode, die die Arbeit des überschriebenen undokumentierten Aufrufs implementiert. Dann verwenden Sie die Obj-C-Laufzeit, um Ihre Implementierung in die undokumentierte zu tauschen. Sie ROT-13 die SELs, so dass textuelle Analyse nirgends den undokumentierten Methodennamen sehen wird. Ich weiß nicht, ob Apple das fangen würde oder nicht!

Weiß nicht, ob das hilft, aber ich dachte, es wäre ein bisschen Spaß.

(ich weiß, dass es viel schneller und clevere Weise unter ROT-13 in Obj-C, als meine einmaligen Implementierung zu tun.)

@implementation MyTextView 
-(void)nothingToSeeHere:(NSRect)aRect 
     heyLookAtThat:(NSColor*)aColor 
{ 
    aRect.size.width = 3.0; 
    [aColor set]; 
    [NSBezierPath fillRect:aRect]; 
} 

#define dipirRot @"_qenjVafregvbaCbvagVaErpg:pbybe:" 
#define ntshRot @"abguvatGbFrrUrer:urlYbbxNgGung:" 
+(void)initialize 
{ 
    if (self == [MyTextView class]) 
    { 
    SEL dipir = NSSelectorFromString([NSString rot13:dipirRot]); 
    SEL ntsh = NSSelectorFromString([NSString rot13:ntshRot]); 
    Method dipirMethod = class_getInstanceMethod([self class], dipir); 
    Method ntshMethod = class_getInstanceMethod([self class], ntsh); 
    IMP ntshIMP = method_getImplementation(ntshMethod); 
    (void)method_setImplementation(dipirMethod, ntshIMP); 
    } 
} 


@implementation NSString (Sneaky) 
+(NSString*)rot13:(NSString*)s 
{ 
    NSMutableString* ms = [[NSMutableString alloc] init]; 
    unsigned len = [s length]; 
    unsigned i; 
    for (i = 0; i < len; i++) 
    { 
    unichar c = [s characterAtIndex:i]; 
    if (c <= 122 && c >= 97) c += (c + 13 > 122)? -13:13; 
    else if(c <= 90 && c >= 65) c += (c + 13 > 90)? -13:13; 
    [ms appendFormat:@"%C", c]; 
    } 
    NSString* ret = [NSString stringWithString:ms]; 
    [ms release]; 
    return ret; 
} 
@end 
6

Das Problem ist der Clipping-Pfad, der in der Tat ist, wenn drawInsertionPointInRect wird aufgerufen.

- (void)drawInsertionPointInRect:(NSRect)rect color:(NSColor *)color turnedOn:(BOOL)flag { 
    rect.size.width = 8.0; 
    NSBezierPath * path = [NSBezierPath bezierPathWithRect:rect]; 
    [path setClip]; // recklessly set the clipping area (testing only!) 
    [path fill]; 
} 

Beachten Sie, dass der obige Code Artefakte verlassen wird (in meinem Test drawInsertionPointInRect nicht die Einfügemarke zu löschen, nur nannte es zu ziehen). Verwenden Sie setDrawsBackground: YES, um die Artefakte schnell und sauber zu löschen.