NSCollectionView:只接受项目之间的拖动,而不是超过
NSCollectionView: Accept Drag Only Between Items, not Over
我实施了 NSCollectionView
并且工作正常。然而,当
拖动项目以重新排列它们,我只想接受拖动
对象之间。
当前行为是您可以在对象之间拖动(它会打开一个
space) 但也 over 一个对象。我希望下面的图片能说明问题。
例如,将一个项目拖到 #2 上,会将它放在 #2 之前。我想要
禁用它并只接受中间的拖动。
在下图中:
- 原始状态
- 项目 #0 被拖在#1 和#2
之间
- 项目 #0 被拖 超过 #2(结果相同)
所以,经过更多的研究,我发现 validadeDrop
方法有
一个准确描述的参数,如果操作结束或在
之间。由于它是作为参考给出的,因此可以更改
覆盖特定行为的参数。所以,解决方案是添加
此检查方法:
- (NSDragOperation)
collectionView:(NSCollectionView *)collectionView
validateDrop:(id<NSDraggingInfo>)draggingInfo
proposedIndex:(NSInteger *)proposedDropIndex
dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation
{
/* ... */
if (*proposedDropOperation == NSCollectionViewDropOn)
*proposedDropOperation = NSCollectionViewDropBefore;
/* ... */
}
我实施了 NSCollectionView
并且工作正常。然而,当
拖动项目以重新排列它们,我只想接受拖动
对象之间。
当前行为是您可以在对象之间拖动(它会打开一个 space) 但也 over 一个对象。我希望下面的图片能说明问题。 例如,将一个项目拖到 #2 上,会将它放在 #2 之前。我想要 禁用它并只接受中间的拖动。
在下图中:
- 原始状态
- 项目 #0 被拖在#1 和#2 之间
- 项目 #0 被拖 超过 #2(结果相同)
所以,经过更多的研究,我发现 validadeDrop
方法有
一个准确描述的参数,如果操作结束或在
之间。由于它是作为参考给出的,因此可以更改
覆盖特定行为的参数。所以,解决方案是添加
此检查方法:
- (NSDragOperation)
collectionView:(NSCollectionView *)collectionView
validateDrop:(id<NSDraggingInfo>)draggingInfo
proposedIndex:(NSInteger *)proposedDropIndex
dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation
{
/* ... */
if (*proposedDropOperation == NSCollectionViewDropOn)
*proposedDropOperation = NSCollectionViewDropBefore;
/* ... */
}