2013-03-26 14 views
8

sto cambiando la dimensione punto di inserimento sovrascrivendo -(void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag, ma non gestisce il primo batter (quando si sposta il punto di inserimento, si torna alla normalità)personalizzati punto di inserimento per NSTextView

sono riuscito a gestire il primo lampeggiamento ignorando il metodo privato - (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor.

Ma questa non è una soluzione per me poiché l'override del metodo privato risulterà in declino da App Store. Voglio che l'app sia nell'App Store. Vedo che App come iAWriter e Writeroom hanno un punto di inserimento personalizzato e sono in App Store.

Qualcuno sa come sono riusciti a farlo, o in un modo migliore invece di scavalcare il metodo privato?

Grazie.

- (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

Hai provato a cancellare l'area del punto di inserimento (riempire con sfondo, qualsiasi altra cosa) quando il flag è falso? –

risposta

0

non faccio App Store, ma mi chiedo se questo piccolo hack "tricky" avrebbe permesso una mosca chiamata non documentato sotto il radar di Apple. Fondamentalmente si dispone di un metodo innocuamente chiamato che implementa il lavoro svolto dalla chiamata non documentata sovrascritta. Quindi si utilizza il runtime Obj-C per scambiare l'implementazione in quella non documentata. Si ROT-13 gli SEL in modo che l'analisi testuale non vedrà il nome del metodo non documentato ovunque. Non so se Apple potrebbe prenderlo o no!

Non so se questo aiuta, ma ho pensato che sarebbe stato un po 'di divertimento.

(non so che di gran lunga più veloce e modi più intelligenti da fare ROT-13 in Obj-C, rispetto al mio one-off implementazione di seguito.)

@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

Il problema è il tracciato di ritaglio che è in vigore quando drawInsertionPointInRect viene chiamato.

- (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]; 
} 

Si noti che il codice di cui sopra lascerà artefatti (nel mio test drawInsertionPointInRect non è chiamato per cancellare il punto di inserimento, solo per disegnarlo). Usa setDrawsBackground: YES per un modo rapido e sporco per cancellare gli artefatti.

Problemi correlati