Я пытаюсь создать вид в виде сетки (аналогично NSCollectionView
), за исключением использования Core Animation. Я довольно далек от этого, и последнее, что осталось сделать, это реализовать прокрутку.
Мои настройки на данный момент таковы, что у меня есть подкласс NSView
(слой на подложке), и при инициализации он создает и добавляет слой сетки в качестве подслоя слоя основного вида. Я создал пользовательский CALayoutManager
для слоя сетки, который упорядочивает его подпредставления в виде сетки. Как и ожидалось, когда я добавляю подслои к слою сетки, вызывается менеджер раскладки, и слои располагаются автоматически. До этого момента все работало как надо.
Проблема возникает, когда я пытаюсь использовать NSScrollView
в качестве родителя моего пользовательского представления для реализации прокрутки. Я настроил это следующим образом: я создал свой пользовательский вид как подпредставление NSScrollView
в Интерфейсном Разработчике. Затем в своем классе менеджера компоновки я добавил свойство delegate
, и во время инициализации мой подкласс представления устанавливает себя в качестве делегата диспетчера компоновки. В конце метода layoutSublayersForLayer:
менеджера макета я вызываю его делегат с методом делегата layoutManager:contentHeightChanged:
. Вот реализация этого метода в моем NSView
подклассе:
- (void)layoutManager:(MyLayoutManager*)manager contentHeightChanged:(CGFloat)height;
{
CGFloat newHeight = [[self enclosingScrollView] contentSize].height;
if (height > newHeight) {
newHeight = height;
}
NSRect newFrame = [self frame];
newFrame.size.height = newHeight;
[self setFrame:newFrame];
}
Это довольно просто, он просто проверяет, больше ли новая высота, чем размер содержимого представления прокрутки, и устанавливает рамку видов с новой высотой.
Это работает - в определенной степени. Когда размер представления изменяется, он корректно изменяет размеры кадра представления, чтобы инкапсулировать всю высоту содержимого, тем самым создавая полосы прокрутки. Проблема: подслои слоя сетки дрожат при изменении размера представления с видимыми полосами прокрутки. Вот видео, показывающее проблему:
http://vimeo.com/16987653
Как вы можете видеть, нет проблем, когда полосы прокрутки не видны (другими словами, когда высота содержимого соответствует границам представления прокрутки). Я могу подтвердить, что это не проблема с менеджером макета и работой с одиночными столбцами, потому что я тестировал то же самое без представления прокрутки, и нет дрожания.
Любой совет с благодарностью.