У меня есть простой, одноколоночный, основанный на представлении NSTableView с элементами в нем, которые можно перетаскивать, чтобы переупорядочить их. Во время перетаскивания я хотел бы сделать так, чтобы в месте под мышкой открывался пробел для пункта-для-падения. GarageBand делает что-то подобное при перетаскивании для изменения порядка треков (видео здесь: http://www.screencast.com/t/OmUVHcCNSl). Насколько я могу судить, в NSTableView нет поддержки для этого.
Кто-нибудь еще пытался добавить это поведение в NSTableView и нашел хорошее решение? Я подумал и попробовал пару подходов без особого успеха. Моя первая мысль заключалась в том, чтобы удвоить высоту строки под мышью во время перетаскивания, отправив -noteHeightOfRowsWithIndexesChanged:
в мой метод источника данных -tableView:validateDrop:...
, а затем дважды вернув нормальную высоту в -tableView:heightOfRow:
. К сожалению, лучше всего могу сказать, что NSTableView не обновляет свой макет во время перетаскивания, поэтому, несмотря на вызов noteHeightOfRowsWithIndexesChanged:
, высота строки фактически не обновляется.
Обратите внимание, что я использую NSTableView, основанный на представлении, но мои строки не настолько сложны, что я не мог перейти к представлению таблицы на основе соты, если это помогло этому. Я знаю о простой, встроенной способности анимировать пробел для упавшего элемента после завершения перетаскивания. Я ищу способ открыть пробел, пока выполняется перетаскивание. Кроме того, это приложение должно быть продано в Mac App Store, поэтому он не должен использовать частный API.
EDIT: Я только что подал запрос на улучшение с Apple, запросив встроенную поддержку такого поведения: http://openradar.appspot.com/12662624. Dupe, если вы тоже захотите его увидеть. Обновление: исправление, которое я запросил, было реализовано в OS X 10.9 Mavericks, и это поведение теперь доступно с использованием API NSTableView. См. NSTableViewDraggingDestinationFeedbackStyleGap.