Как имитировать представление рабочего процесса Automator?

Я начинаю разрабатывать свое первое полноценное приложение Cocoa, содержащее представление, которое я хотел бы вести (и выглядеть) аналогично AMWorkflowView Automator.

Основные функции, которые я хотел бы достичь:

  • Позиционирование подвидов
  • Отображение подвидов в развернутом/свернутом состоянии
  • Множественный выбор
  • Перетащите

Чтобы привыкнуть к Cocoa, я начал с пользовательского NSView, который в основном служил контейнером для пользовательских подпредставлений и обрабатывал их позиционирование и множественный выбор. Подвиды также являются подклассами NSView и содержат переменное количество самих представлений, таких как кнопки, метки и всплывающие меню, и поэтому могут иметь разную высоту. Это сработало довольно хорошо, но прежде чем продолжить, я хочу убедиться, что все аккуратно и аккуратно в соответствии с шаблоном MVC.

Я подозреваю, что в Cocoa уже есть класс, облегчающий реализацию контейнера представления, например, NSCollectionView. Кажется, что нет (простого) способа для отображения представлений разного размера в NSCollectionView. Должен ли я продолжать реализацию своего пользовательского NSView (вероятно, используя NSArrayController для поддержки выбора и сортировки), или есть лучшие способы?

Любая помощь высоко ценится


person andyfeind    schedule 05.04.2010    source источник


Ответы (1)


К сожалению, ответ вам придется свернуть самостоятельно. NSCollectionView не позволяет использовать элементы переменного размера (что также исключает развернутые/свернутые состояния).

Для ограниченного числа элементов вы можете сделать это довольно легко (вам просто нужно представление контейнера, которое правильно упорядочивает подпредставления, когда вас просят о макете, затем вам нужно убедиться, что вы повторно макетируете, когда что-то меняется). Однако для многих подпредставлений вам нужно позаботиться о том, чтобы быть максимально эффективными. Это может начаться с размещения как можно меньшего (например, только того, что «после» представления с измененным размером) и дойти до сложности, например, кэширования визуального представления представления прототипа, отрисовки кэшированных изображений (быстро!) для всего, кроме представления. редактируется и использует/позиционирует только «реальный» вид для редактируемого вида.

Перетаскивание работает так же, как и всегда, но ничего из вышеперечисленного не объясняет красивую анимацию, которую дает вам NSCollectionView. :-) Это быстро и красиво анимировано именно потому, что потому что все подпредставления унифицированы (поэтому вычисления макета выполняются быстро и просто). Как только вы добавите нестандартные размеры, проблема значительно усложнится.

Итог: Если вам нужны представления переменного размера, NSCollectionView не подойдет и вам нужно будет накатывать свой или искать чужой общий код, но производительность и красивая анимация будут непростыми.

person Joshua Nozzi    schedule 06.04.2010
comment
Спасибо за ответ. Я уже подозревал это. Я попытаюсь воспроизвести архитектуру NSCollectionView и его NSCollectionViewItems. - person andyfeind; 07.04.2010