2010-04-08 22 views
0

Salutations,sous-classe NSCollectionView ne remet pas drawRect lors de la session de glisser malgré setNeedsDisplay

Je suis perplexe quant à savoir quand et comment drawRect est censé être appelé dans une sous-classe NSCollectionView .

je mets en œuvre glisser-déposer opération afin de se déplacer NSCollectionViewItems dans la collection, et je voudrais dessiner une indication visuelle de mettrait fin à la baisse.

La sous-classe n'appelle pas drawRect pendant la session de déplacement. (Cela se fait pendant le défilement)

Est-ce l'opération prévue? Toute indication sur la manière d'implémenter correctement ce comportement est la bienvenue.

Un projet complet Xcode du code ci-dessous est disponible à l'adresse: http://babouk.ovh.org/dload/MyCollectionView.zip

Meilleures salutations

Mise à jour: Le code exemple est erroné. Un appel à registerForDraggedTypes, rend la collection triggerRect comme prévu.

Exemple de code:

@interface CollectionViewAppDelegate : NSObject <NSApplicationDelegate> 
{ 
    NSWindow   *window; 
    NSMutableArray  *collectionContent; 
} 
/* properties declaration */ 
/* KVC compliance declarations */ 
@end 

@interface MyCollectionView : NSCollectionView 
@end 

@interface ItemModel 
{ 
    NSString *name; 
} 
@property (copy) NSString *name; 
@end 

@implementation MyCollectionView 
- (void)awakeFromNib { 
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSStringPboardType, nil]]; 
} 

- (void)drawRect:(NSRect)rect { 
    NSLog(@"DrawRect"); 
} 

- (void)mouseDragged:(NSEvent *)aEvent { 
    NSPoint  localPoint = [self convertPoint:[aEvent locationInWindow] fromView:nil]; 
    [self dragImage:[NSImage imageNamed:@"Move.png"] 
       at:localPoint 
      offset:NSZeroSize 
       event:aEvent 
     pasteboard:nil 
      source:self 
      slideBack:NO]; 
} 

- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender { 
    return YES; 
} 

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    return NSDragOperationEvery; 
} 

- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender { 
    [self setNeedsDisplay:YES]; 
    return NSDragOperationEvery; 
} 

- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal {  
    return NSDragOperationEvery; 
} 

- (void)mouseDown:(NSEvent *)theEvent { 
} 

@end 

@implementation CollectionViewAppDelegate 

@synthesize window, collectionContent, collectionView; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSMutableArray *data = [[NSMutableArray alloc] init]; 
    /* Fill in data */ 
    [self setCollectionContent:data]; 
    [data release]; 
} 

/* dealloc */ 

/* KVC implementation */ 
@end 

@implementation ItemModel 
@synthesize name; 
/* dealloc */ 
@end 

Répondre

1

Je ne pense pas que vous pouvez sous-classe avec succès les routines de dessin de » NSCollectionView. En interne, les vues de collection sont présentées dans Core Animation Layers et donc -drawRect: n'est pas utilisé pour rendre leur contenu.

+0

Merci pour votre réponse, vous avez raison. Cependant, drawRect est appelé comme attendu dans l'exemple, après avoir corrigé un appel manquant dans registerForDraggedTypes. Le problème est toujours présent dans mon application en taille réelle. Je continue d'enquêter. –