【问题标题】:NSCollectionView: Accept Drag Only Between Items, not OverNSCollectionView:只接受项之间的拖动,而不是结束
【发布时间】:2015-08-31 15:01:53
【问题描述】:

我有一个 NSCollectionView 实现并且工作正常。然而,当 拖动项目以重新排列它们,我只想接受拖动 对象之间。

当前的行为是您可以在对象之间拖动(它会打开一个 空间)但也一个对象。我希望下面的图片能说得更好。 例如,将项目拖到#2 上会将其放在#2 之前。我想要 禁用此功能并仅接受两者之间的拖动。

在下面的图片中:

  1. 原始状态
  2. 项目#0 被拖到了#1 和#2 之间
  3. Item #0 被拖到了 #2(结果一样)

【问题讨论】:

  • 您的收藏视图有委托吗?
  • @Willeke 是的,当然。
  • 你能在你拖动的地方显示你的代码吗,或者相关的东西
  • @anhtu 是的,但我不知道这是否有什么不同。它是标准拖放操作的非常通用和大的实现。我并不是在问如何解决问题,只是在问如何实施 :-) 您需要查看的任何特定部分?
  • 为什么不通过单元格的索引(indexPath.row 或类似的东西)来检测它?或者使用CGRectIntersectsRect,如果它与连续的> = 2个单元格相交,则接受。或者使用每个单元格的位置来检测之间,结束。我想你已经考虑过了。我只是想知道为什么不这样做?

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


【解决方案1】:

所以,经过一番研究,我发现validadeDrop 方法有 一个参数,准确描述,如果操作结束或在 之间。而且由于它是作为参考给出的,因此可以更改 覆盖特定行为的参数。所以,解决方案是添加 这个检查方法:

- (NSDragOperation)
    collectionView:(NSCollectionView *)collectionView
      validateDrop:(id<NSDraggingInfo>)draggingInfo
     proposedIndex:(NSInteger *)proposedDropIndex
     dropOperation:(NSCollectionViewDropOperation *)proposedDropOperation
{
    /* ... */

    if (*proposedDropOperation == NSCollectionViewDropOn)
        *proposedDropOperation =  NSCollectionViewDropBefore;

    /* ... */
}

【讨论】:

  • 谢谢我在这件事上大吃一惊!
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2019-01-08
  • 2013-11-19
  • 2021-09-14
  • 2022-06-20
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多