Objective c 如何在NSScrollView的子视图上进行拖放?与LaunchPad完全相同
我找了很多。但是我很困惑,所以我来这里解决我的问题 我想制作一个与mac os的LaunchPad完全相同的视图。拥有iOS编程方面的专业知识,而不是mac 这是我开始MacOSX编程的时间 请告知哪些组件是它最好的组成部分 我从NSScrollView开始,内部子视图继承了NSView 但我对此没有什么疑惑 拖动操作是否接受NSScrollView的子视图??(通常在iOS中有一些复杂的逻辑来实现这一点) 拖放或其他操作时是否可以使用此部件?? 还有一些鼠标事件也有。我想这会有帮助的 请建议一些链接或博客,推动我在这项任务中前进 求你了Objective c 如何在NSScrollView的子视图上进行拖放?与LaunchPad完全相同,objective-c,macos,cocoa,drag-and-drop,nsscrollview,Objective C,Macos,Cocoa,Drag And Drop,Nsscrollview,我找了很多。但是我很困惑,所以我来这里解决我的问题 我想制作一个与mac os的LaunchPad完全相同的视图。拥有iOS编程方面的专业知识,而不是mac 这是我开始MacOSX编程的时间 请告知哪些组件是它最好的组成部分 我从NSScrollView开始,内部子视图继承了NSView 但我对此没有什么疑惑 拖动操作是否接受NSScrollView的子视图??(通常在iOS中有一些复杂的逻辑来实现这一点) 拖放或其他操作时是否可以使用此部件?? 还有一些鼠标事件也有。我想这会有帮助的 请建议一
您的视图或窗口需要注册以接收您感兴趣的粘贴板类型的拖动:
[self registerForDraggedTypes:@[(id)kUTTypeURL]];
当拖动进入视图时,您将得到第一个回调:
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)info
{
NSPasteboard *draggingPasteboard = [info draggingPasteboard];
// NSDragOperation draggingSourceOperationMask = [sender draggingSourceOperationMask];
NSArray *classes = @[[NSURL class]];
NSDictionary *options = @{NSPasteboardURLReadingFileURLsOnlyKey : @YES};
if ([draggingPasteboard canReadObjectForClasses:classes options:options]) {
// NSArray *fileURLs = [draggingPasteboard readObjectsForClasses:classes
// options:options];
//
// if ([fileURLs count] != 1) {
// return NSDragOperationNone;
// }
return NSDragOperationLink;
}
return NSDragOperationNone;
}
-(NSDragOperation)DragginGeted:(id)信息
{
NSPasteboard*draggingPasteboard=[info draggingPasteboard];
//NSDRAGO操作draggingSourceOperationMask=[发送方draggingSourceOperationMask];
NSArray*类=@[[NSURL类]];
NSDictionary*选项=@{NSPasteboardURLReadingFileURLsOnlyKey:@YES};
if([draggingPasteboard CanReadObjectForClass:classes选项:选项]){
//NSArray*fileURLs=[draggingPasteboard ReadObjectsForClass:类
//选项:选项];
//
//如果([FileURL计数]!=1){
//返回nsdragooperationne;
// }
返回NSDragOperationLink;
}
返回nsdragooperationne;
}
如果拖动在视图上结束(例如,文件被删除),您将获得另一个回调,您可以从粘贴板读取并处理收到的项目:
- (BOOL)performDragOperation:(id <NSDraggingInfo>)info
{
NSPasteboard *draggingPasteboard = [info draggingPasteboard];
if ([draggingPasteboard canReadObjectForClasses:[NSArray arrayWithObject:[NSURL class]] options:nil]) {
return [self addItemWithDragInfo:info];
}
return NO;
}
- (BOOL) addItemWithDragInfo:info:(id <NSDraggingInfo>)info
{
NSPasteboard *draggingPasteboard = [info draggingPasteboard];
NSArray *classes = @[[NSURL class]];
NSDictionary *options = @{NSPasteboardURLReadingFileURLsOnlyKey : @YES};
NSArray *fileURLs = [draggingPasteboard readObjectsForClasses:classes options:options];
// TODO: Do something with those files…
return YES;
}
-(BOOL)性能跟踪操作:(id)信息
{
NSPasteboard*draggingPasteboard=[info draggingPasteboard];
if([draggingPasteboard CanReadObjectForClass:[NSArray arrayWithObject:[NSURL class]]选项:nil]){
返回[self addItemWithDragInfo:info];
}
返回否;
}
-(BOOL)addItemWithDragInfo:info:(id)info
{
NSPasteboard*draggingPasteboard=[info draggingPasteboard];
NSArray*类=@[[NSURL类]];
NSDictionary*选项=@{NSPasteboardURLReadingFileURLsOnlyKey:@YES};
NSArray*fileURLs=[draggingPasteboard读取对象循环:类选项:选项];
//TODO:对那些文件做点什么…
返回YES;
}
顺便说一句,LaunchPad可能使用NcollectionView或IKImageBrowserView。这些视图已经包含了一些对拖放的支持。您确定NSCollectionView对我的情况有帮助吗?我在Mac应用程序(HoudahSpot、HoudahGeo和Tembo–)中使用了IKImageBrowserView。我记得我反复评估了NSCollectionView。不幸的是,我总是忘记为什么每次我最终都更喜欢IKImageBrowserView而不是NSCollectionView。是否有任何选项可供摸索??就像LaunchPad中的实用程序文件夹一样。我不这么认为。您可以通过在主视图上方临时显示第二个浏览器视图来实现这一点。我太困惑了。我刚刚用IKImageBrowserView做了一个拖放功能。但我不确定它是否会和LaunchPad视图一样。请建议我如何在正确的轨道上前进。