2013-03-26 15 views
8

mam Zmiana rozmiaru punkt wstawiania nadrzędnymi -(void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag, ale nie zajmuje pierwszego migać (jeśli przenieść punkt wstawiania, to wraca do normy)Niestandardowy punkt wstawiania na NSTextView

udało mi się obsłużyć pierwsze mrugnięcie, przesłonięcie prywatnej metody - (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor.

Ale to nie jest rozwiązanie dla mnie, ponieważ pominięcie metody prywatnej spowoduje, że App Store zostanie odrzucony. Chcę, aby aplikacja była w App Store. Widzę aplikacje takie jak iAWriter i Writeroom mają niestandardowy punkt wstawiania i znajdują się w App Store.

Czy ktoś wie, w jaki sposób udało się to zrobić, czy lepiej, niż nadpisywanie prywatnej metody?

Dzięki.

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

Czy próbowałeś wyczyścić obszar punktu wstawienia (wypełnij tłem, cokolwiek innego), gdy flaga jest fałszywa? –

Odpowiedz

0

nie robię App Store, ale zastanawiam się, czy to „trudne” mały kilof pozwoliłby nieudokumentowane wywołania muchy pod radar Apple. Zasadniczo masz niewinnie nazwaną metodę, która implementuje pracę, którą zastępuje nieudokumentowane wywołanie. Następnie używasz środowiska wykonawczego Obj-C, aby zamienić implementację w nieudokumentowaną. Ty ROT-13 SEL, aby analiza tekstowa nie widziała nigdzie nieudokumentowanej nazwy metody. Nie wiem, czy Apple by to złapało, czy nie!

Dunno, jeśli to pomaga, ale pomyślałem, że będzie to trochę zabawne.

(wiem, że zdecydowanie szybsze i sprytniejsze sposoby wykonywania ROT-13 w Obj-C, niż mój jednorazowej realizacji poniżej.)

@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

Problemem jest ścieżką obcinania, które ma miejsce, gdy Funkcja drawInsertionPointInRect jest wywoływana.

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

Zauważ, że powyższy kod pozostawi artefakty (w moim testowania drawInsertionPointInRect nie jest powołany, aby usunąć punkt wstawiania, tylko do rysowania). Użyj setDrawsBackground: YES dla szybkiego i brudnego sposobu na usunięcie artefaktów.

Powiązane problemy