Открытие пробела в NSTableView во время перетаскивания

У меня есть простой одностолбцовый NSTableView на основе представления с элементами в это то, что можно перетащить, чтобы изменить их порядок. Во время перетаскивания я хотел бы сделать так, чтобы в месте под мышью открывался зазор для элемента, который нужно сбросить. GarageBand делает что-то подобное, когда вы перетаскиваете дорожки, чтобы изменить их порядок (видео здесь: http://www.screencast.com/t/OmUVHcCNSl). Насколько я могу судить, в NSTableView нет встроенной поддержки для этого.

Кто-нибудь еще пытался добавить такое поведение в NSTableView и нашел хорошее решение? Я подумал и попробовал пару подходов без особого успеха. Моей первой мыслью было удвоить высоту строки под мышью во время перетаскивания, отправив -noteHeightOfRowsWithIndexesChanged:в мой источник данных -tableView:validateDrop:... метод, а затем вернув вдвое больше нормальной высоты в -tableView:heightOfRow:. К сожалению, насколько я могу судить, NSTableView не обновляет свой макет во время перетаскивания, поэтому, несмотря на вызов noteHeightOfRowsWithIndexesChanged:, высота строки на самом деле не обновляется.

Обратите внимание, что я использую представление NSTableView на основе представления, но мои строки не настолько сложны, чтобы я не мог перейти к представлению таблицы на основе ячеек, если бы это помогло выполнить это.Я знаю о простой встроенной возможности анимировать зазор для брошенного предмета после завершения перетаскивания. Я ищу способ открыть зазор во время перетаскивания. Кроме того, это приложение должно продаваться в Mac App Store, поэтому оно не должно использовать частный API.

РЕДАКТИРОВАТЬ: я только что подал в Apple запрос на улучшение, запрашивая встроенную поддержку этого поведения: http://openradar.appspot.com/12662624. Обманывайте, если хотите тоже это увидеть. Обновление: запрошенное мною усовершенствование было реализовано в OS X 10.9 Mavericks, и это поведение теперь доступно с использованием NSTableView API. См. NSTableViewDraggingDestinationFeedbackStyleGap.

22
задан Andrew Madsen 21 October 2014 в 21:55
поделиться