NSStackView/NSScrollView - разделенное пополам подпредставление NSStackview?

это будет трудно объяснить. Я изменяю образец кода InfoBarStackView от Apple. Проблема, с которой я сталкиваюсь, заключается в том, что это выглядит так, как будто одно из подпредставлений делится на два с помощью NSStackview и отображается отдельно.

В моем примере я добавляю 4 подвида в представление стека, каждый точно такого же размера (и тот же код). Затем он помещается в NSScrollView. (Раскладка вертикальная.)

Когда приложение запущено, я вижу самые первые два подвида. Когда я прокручиваю вниз, начинаются странности. Последующий вид визуализируется, где визуализируется нижняя часть, затем визуализируется верхняя часть. Если размер по вертикали составляет 272 пикселя, нижняя часть отображается как 256 пикселей, а верхняя — это остаток (16). Прокрутка вниз до последнего представления вызывает ту же проблему.

Приложены несколько снимков экрана для иллюстрации: NSViews в NSStackView при запуске..

NSViews в NSStackView разделены на две части..

У меня есть пример проекта для Xcode 8. Я разместил проект Xcode 8 здесь, если кто-то захочет взглянуть. Кажется, я не могу понять это.


person Bob-GlueTools    schedule 16.05.2017    source источник
comment
Вы понимаете, что такое dirtyRect в - (void)drawRect:(NSRect)dirtyRect?   -  person Willeke    schedule 17.05.2017


Ответы (2)


Вы имеете в виду дополнительные ограничивающие рамки, которые пересекают кнопки «Ярлык» и «Показать»?

Если вы используете Xcode View Debugger для просмотра декомпозиции иерархии представлений и нарисованного содержимого каждого представления, вы увидите, что дополнительные ограничивающие рамки отрисовываются GT_BorderedViews, то есть нижние GT_BorderedViews рисуют две ограничивающие рамки. .

Реализация GT_BorderedView -drawRect: вычисляет и рисует ограничивающие рамки на основе переданного dirtyRect. Однако, поскольку состояния документации, грязный прямоугольник — это «прямоугольник, определяющий часть представления, требующую перерисовки», а не обязательно все границы представления. Изменение реализации для расчета и рисования границы на основе [self bounds] вместо грязного прямоугольника приводит к ожидаемому виду.

person Taylor    schedule 16.05.2017
comment
Спасибо! Вы совершенно правы. Я полностью упустил тот факт, что dirtyRect не рисовал весь вид. [self bounds] решает проблему. - person Bob-GlueTools; 17.05.2017

Тейлор попал в точку. Я не понимал, что drawRect не отображает весь вид. Использование [self bounds] вместо dirtyRect гарантирует правильность отрисовки.

person Bob-GlueTools    schedule 17.05.2017