2011-01-18 5 views
0

В моей программе я реализую пользовательский вид, немного похожий на табличный вид. Для этого я подклассифицировал NSView. Теперь мой вопрос: каков наиболее эффективный способ рисовать все ячейки представления таблицы. Должен ли я просто использовать NSView или, возможно, что-то еще, например CALayers?Какао - эффективный вид чертежа

Спасибо!

P.S .: Это на Mac OS X, не на iOS.

+0

Эта таблица используется для просмотра? Это важная часть вашего вопроса, поскольку она диктует оптимальные варианты оптимизации. –

+0

@ Joshua Nozzi: В принципе, как в настольном представлении в iOS. Использование пользовательских ячеек и таких ... – ryyst

ответ

1

Основываясь на ваш вопрос и комментарий, я предлагаю два варианта:

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

Roll Your Own - Это сложнее, но дает вам гибкость. Как и в случае с NSCollectionView/NSCollectionViewItem, у вас будет представление, которое служит контейнером, и в идеале вы бы хотели, чтобы вы повторно использовали различные «элементы», которые он показывает. Используя тот же вид, чтобы установить свой представленный объект и «штамповать» его на место (поместите его и нарисуйте), вы можете прокрутить всю свою коллекцию за один раз, затем использовать тот же вид, что и живой, активный вид для любого выбранного, сфокусированного у вас есть. Еще быстрее: прокручивайте и кешируйте изображения и размеры каждого элемента с помощью своего многоразового элемента и извлекайте все из кеша, кроме выбранного элемента (который будет использовать реальное представление в реальном времени, соответствующее его правильному расположению, обновляя кэшированное изображение самого себя поскольку его содержимое изменяется, когда оно не выбрано). Быстрее: 1 просмотр в реальном времени и 1 "для кэширования", и нарисуйте только вычисленные выходы кэшированных изображений, которые пересекают видимый прямоугольник (без «живого»/выбранного представления). Примечание. Кэширование необходимо будет переделать каждый раз при изменении ширины рамки контейнера, поскольку, по-видимому, сокращение горизонтально означает, что все предметы растут вертикально. Если вы можете, воспользуйтесь NSOperation/NSOperationQueue для обработки кеширования в фоновом режиме, отметив только повторное отображение, когда все кешированные элементы 0 - n (где n является наивысшим индексом, пересекающим видимый прямоугольник) являются доступный.

Я использую что-то очень близкое к последнему в одном из своих приложений, где «элемент» - это запись с текстом различной длины. Я не использую все тактики, о которых я упоминал в своем собственном решении, но большинство и увеличение производительности очень удовлетворяют. :-)

Надеюсь, это поможет.

+0

Woah, спасибо за ответ! Мне нужно будет свернуть собственный код, так как я хочу иметь изменяемые размеры ячеек. – ryyst

+0

Как мне «поместить его и нарисовать»? – ryyst

+0

Как и NSCollectionView/Item, ваш прототип будет иметь соответствующий контроллер. Этот контроллер имеет свойство -представляемое свойство Object, которое заботится об обновлении содержимого представления для представления объекта. Для каждой вещи, которую вы хотите нарисовать, вы должны установить объект объекта контроллера элемента, обновить его представление, а затем захватить его изображение с помощью -dataWithPDFInsideRect NSView: (вызовите это против вашего прототипа). Это изображение - это то, что вы будете кэшировать, а также рисовать в нужном месте в вашем представлении контейнера. –

Смежные вопросы