Custom NSTextFieldCell als DataCell

  • Custom NSTextFieldCell als DataCell

    Hallo,

    ich habe ein NSTextFieldCell Subclass, den ich als DataCell ein einer NSTableColumn nutze. Die Column ist in einem NSOutlineView.

    Beim Ändern der Breite des OutlineViews ergibt sich folgendes:

    tinyurl.com/3dh29e (QuickTime Movie)

    Die Cell wird scheinbar nur beim Loslassen des SplitViews zum Neuzeichnen angeregt.

    Auffällig ist, dass dies bei der selektierten Reihe nicht geschieht. Ich dachte zunächst daran, dass eventuell der Hintergrund nicht neu gezeichnet wird - habe ich aber ausgeschlossen.

    Hier mal die drawWithFrame Methode (man beachte: nicht optimiert und alles andere als sauber - allerdings vom Prinzip her das, was ich möchte:

    Quellcode

    1. - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    2. [super drawWithFrame:NSInsetRect(cellFrame, NSHeight(cellFrame), 0.0) inView:controlView];
    3. [[self icon] setScalesWhenResized:YES];
    4. [[self icon] setSize:NSMakeSize(NSHeight(cellFrame), NSHeight(cellFrame))];
    5. [[self icon] setFlipped:YES];
    6. [[self icon] drawInRect:NSMakeRect(NSMinX(cellFrame), NSMinY(cellFrame), NSHeight(cellFrame), NSHeight(cellFrame)) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
    7. NSAttributedString *countString = [[[NSAttributedString alloc] initWithString: [[self count] stringValue] attributes:[NSDictionary dictionaryWithObject:[NSColor whiteColor] forKey:NSForegroundColorAttributeName]] autorelease];
    8. NSSize countRectSize = [countString size];
    9. countRectSize.width += 15.0;
    10. NSPoint countRectOrigin = NSMakePoint(NSMaxX(cellFrame)-countRectSize.width, NSMinY(cellFrame)+(countRectSize.height/2.0));
    11. NSRect countRect = NSMakeRect(countRectOrigin.x, countRectOrigin.y, countRectSize.width, countRectSize.height);
    12. NSBezierPath *countBezierPath = [NSBezierPath bezierPathWithRoundedRect:countRect xRadius:5 yRadius:5];
    13. [[NSColor lightGrayColor] setFill];
    14. [countBezierPath fill];
    15. [countString drawAtPoint:NSMakePoint(countRectOrigin.x + 15.0/2, countRectOrigin.y)];
    16. }
    Alles anzeigen
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Ich glaube, das Problem wird durch die live resize Optimierung des NSOutlineViews hervorgerufen. Frag mich nicht, warum das bei den Standardcells nicht passiert, aber du kannst es vermutlich umgehen, indem du von NSOutlineView ableitest und das Verhalten folgendermaßen abschaltest:

    Quellcode

    1. - (BOOL)inLiveResize
    2. {
    3. return NO;
    4. }