Перетащите выделение в NSCollectionView изнутри элементов

У меня есть ряд элементов, которые я показываю в NSCollectionView. Выбор и множественный выбор включены.

Пользователь может выбирать элементы путем перетаскивания (т. е. отмечать элементы путем перетаскивания). однако это работает, когда пользователь начинает перетаскивать с фона представления коллекции или пространства между элементами (а не на элементах), но я хочу сделать это возможным, когда перетаскивание начинается и с элементов.

Я хочу что-то вроде этой фотографии, если мы рассматриваем текст и изображение как единый элемент.

введите здесь описание изображения

источник изображения: http://osxdaily.com/2013/09/16/select-multiple-files-mac-os-x/

Заранее спасибо.


person Alan    schedule 13.02.2018    source источник
comment
Что вы сделали до сих пор?   -  person Willeke    schedule 13.02.2018
comment
Дело в том, что до этого состояния большая часть работы выполняется через IB, а Datasource просто показывает элементы. Здесь я хочу добиться дополнительной функции, которая по умолчанию не реализована в NSCollectionView.   -  person Alan    schedule 13.02.2018
comment
Что вы сделали для реализации перетаскивания? Покажи нам свой код.   -  person Willeke    schedule 13.02.2018
comment
это не перетаскивание, это перетаскивание, как в приложении поиска, которое вы отмечаете элементы, но я хочу, чтобы оно работало, когда пользователь начинает перетаскивание элементов. Это связано с событиями, но я не могу понять, как это сделать.   -  person Alan    schedule 13.02.2018


Ответы (1)


Реализуйте hitTest(_:) в классе представления элементов, чтобы элементы «просматривались» для кликов. Возвращайте представление коллекции вместо представления элемента, когда пользователь щелкает в представлении элемента.

override func hitTest(_ point: NSPoint) -> NSView? {
    var view = super.hitTest(point)
    if view == self {
        repeat {
            view = view!.superview
        } while view != nil && !(view is NSCollectionView)
    }
    return view;
}
person Willeke    schedule 20.02.2018
comment
Это сделало работу очень хорошо, я ценю помощь - person Alan; 20.02.2018
comment
как я могу сказать, что не выбирайте элемент, если прямоугольник выбора не закрывает или не пересекается с верхней половиной представления? Я могу добавить эту логику в ваш код, но это работает только для первого элемента, который инициирует выбор перетаскиванием, и когда прямоугольник выбора пересекается с границей другого представления элемента, он выбирается. - person Alan; 25.02.2018