Использование NSScrollView с CALayer - PullRequest
3 голосов
/ 19 ноября 2010

Я пытаюсь создать вид в виде сетки (аналогично 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

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

Любой совет с благодарностью.

1 Ответ

1 голос
/ 20 ноября 2010

Решил эту проблему, перевернув систему координат слоя и вида (начало координат в верхнем левом углу).

...