Проблема разработки: Core Animation, NSCollectionView и NSCollectionViewItems - PullRequest
4 голосов
/ 24 ноября 2011


Я борюсь с проблемой дизайна: у меня есть NSCollectionView, который содержит несколько элементов (он связан с NSArrayController, который, в свою очередь, связан с NSManagedObjectContext). Я решил нарисовать представление для каждого отдельного элемента программно, главным образом потому, что заметил, что вложение нескольких NSView в представление элементов создает проблемы с производительностью, когда в представлении набора больше определенного количества элементов.
Рассмотрим следующую иерархию: NSCollectionView => NSCollectionViewItem -> NSView. (Используется по умолчанию NSCollectionView). Мой пользовательский NSView содержит несколько слоев, некоторые из которых CATextLayer s, другие - обычные CALayer s, и все они анимируются вместе (в пределах одного CATransaction), когда это необходимо. Проблема здесь в том, что каждый CALayer должен отображать содержимое некоторых данных, которые доступны через свойство representedObject NSCollectionViewItem ..., которому принадлежит NSView! У меня есть два варианта (вероятно, гораздо больше, я более чем открыт для предложений):
- Я копирую representedObject с NSCollectionViewItem на NSView и сохраняю его согласованным во время выполнения программы. Мне не очень нравится этот.
- Я выставляю CALayer s в NSView, и я устанавливаю их содержимое / строку из метода NSCollectionViewItem s setRepresentedObject:. Мне больше нравится этот, потому что в NSView нет данных, сохраненных (за исключением того, что показано через слои, конечно).
Я ошибся? Есть ли более элегантное решение?

Заранее спасибо, я очень ценю помощь. Приветствия

Джан Марко

1 Ответ

3 голосов
/ 19 февраля 2013

Задал этот вопрос довольно поздно, и я подумал, что это интересная проблема дизайна.

Если вы не взломали это или вам не понравилось ни одно из ваших решений:

Я бы предложил написать подкласс NSCollectionViewItem, который наблюдает путь (ы) ключа self.representedObject и обновляет его представление и подпредставления при изменении объекта модели.

NSCollectionViewItem - это NSViewController, который подразумевает, что он должен отвечать за управление своими представлениями. Вы можете уважать это, имея слой представления, с которым он работает, в виде пользовательского представления своего объекта модели, хранящегося в его свойстве presentObject. Таким образом, наблюдая за всеми необходимыми свойствами модели с помощью KVO, вы должны иметь удобное место для вызова всех операций представления, касающихся «рендеринга» модели. На этом этапе вы должны иметь полный контроль над тем, хотите ли вы работать с NSView API или CALayer API.

Исходя из того, насколько сложен ваш вид элемента-прототипа, размера и изменчивости набора элементов, требования пользовательского интерфейса к «живости» и других факторов, вы можете уйти с очень грубым наблюдением или вам нужна очень мелкозернистая модель - надеюсь, вы привыкли работать с KVO API!

Я также хотел бы услышать, какой выбор вы сделали в итоге.

...