objective-c - 尽管 setNeedsDisplay,NSCollectionView 子类在拖动 session 期间不会调用drawRect

标签 objective-c cocoa drag-and-drop nscollectionview

问候,

我很困惑如何以及何时在 NSCollectionView 子类中调用 drawRect

我实现了拖放操作,以便在集合内移动NSCollectionViewItems,并希望绘制一个视觉指示来指示拖放的结束位置。

子类在拖动 session 期间不会调用drawRect。 (滚动期间会发生)

这是预期的操作吗? 欢迎任何有关如何正确实现此行为的提示。

以下代码的完整 xcode 项目位于: http://babouk.ovh.org/dload/MyCollectionView.zip

致以诚挚的问候

更新: 示例代码是错误的。调用registerForDraggedTypes,使集合按预期触发drawRect。

代码示例:

@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

最佳答案

我认为您无法成功子类化 NSCollectionView 的绘图例程。在内部, Collection View 布置在核心动画层中,因此不使用 -drawRect: 来渲染其内容。

关于objective-c - 尽管 setNeedsDisplay,NSCollectionView 子类在拖动 session 期间不会调用drawRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603622/

相关文章:

Java 拖放图像并在拖动时显示图像缩略图

iOS 缓存 UIWebView

python - PySide:将文件拖放到 QListWidget 中

iphone - iOS - 谁能建议我如何将 gmail 帐户集成到我的应用程序中并获取所有电子邮件的列表?

c# - 如何在 NSGridView 或 NSTableView 中跨列

cocoa - 提取二进制文件 cocoa 的内容

cocoa - 在cocoa App中嵌入字体并由IB使用

.net - ListView 的 DragEnter、DragOver、DragDrop 事件未引发 (AllowDrop=True)

objective-c - FoundationTool 中的 Runloop

objective-c - 如何改变 NSScroller 的颜色?