Сопровождаемые на основе слоев NSView братья могут перекрываться?

Я немного смущен. В Apple Documentation указано следующее:

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

Итак, в соответствии с этим, мнения сестры не должны перекрываться, иначе поведение undefined.

В Cocoa демонстрационное приложение для слайд-шоу, однако, родные сестры NSView с поддержкой слоев перекрывают, и это похоже, отлично работает:

Cocoa Slides screenshot

Итак, неправильный пример кода Cocoa Slides, и это просто совпадение, что оно работает, или устаревшая документация? Устаревший с 10.5, то есть?

Ответ 1

Перекрывающиеся представления работают нормально, с поддержкой слоя или нет, на Leopard и выше.

Ответ 2

После некоторых исследований кажется, что документация Apple действительно устарела.

Считается, что младшие братья NSView с перекрытием могут перекрываться с 10.5.

В этом обсуждении с 2009 года, включающем инженеров Apple Дэвида Дункана и Corbin Dunn, наконец, приводятся некоторые четкие ответы:

Перекрытие представлений работает на Leopard, но не работает до этого. документация устарела.

У меня есть группа просмотров, каждая из которых имеет более мелкие виды внутри,   которые должны быть представлены с перекрытием по сравнению с тем же   прямо в окне, чтобы их можно было видеть друг от друга. В моем   предварительные тесты, я сделал каждый большой взгляд одним и тем же   фоном. Планировал принести каждого на фронт,   когда это необходимо, переупорядочивая z-порядок. Есть ли будущее (или   настоящее) в этом приложении?

Это будет работать на Leopard.

Источник: http://www.cocoabuilder.com/archive/cocoa/228191-nsview-behaves-different-on-10-4-vs-10-5.html#228983

Обновление: Джеймс Демпси также ответил на Twitter:

Мое понимание заключается в том, что совпадающие представления сестры в порядке с 10.5, с поддержкой слоев или нет.

Ответ 3

Представления с поддержкой Layer-layer слоируются OpenGL (ну, композитор Quartz, но он помогает думать о каждом слое как полигоне с текстурой OpenGL на нем), поэтому они всегда поддерживали правильное перекрытие.

В потоке на CocoaBuilder/ Cocoa -Dev вообще не упоминаются слои. Это означает, что он говорит о регулярных NSView без поддержки CALayer (точнее, только с CALayer для всего окна).

Одно из упомянутых исключений - OpenGLView (опять же, без слоев), который всегда компонует прямоугольник OpenGL поверх окна, уничтожая любые подпункты. Я не думаю, что создание NSOpenGLView работает с поддержкой слоев, но вместо этого можно использовать слой OpenGL, который будет правильно компоноваться между другими слоями.

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

Короче говоря, он работает с 10.5 для не-слоистых и с тех пор навсегда для просмотра с поддержкой слоев с оговорками при смешивании и сопоставлении или использовании OpenGL.

PS - Я не уверен на 100%, однако утверждение о перекрытии неэлементных представлений должно быть принято как каноническое. Это неофициальное выражение, сделанное инженером Apple. Все могло измениться, и могли быть обнаружены ошибки, которые бы не сработали. Обычно я использую слои, когда мне нужно правильное перекрытие.

Ответ 4

Это может быть полезно кому-то: у меня была проблема с мерцающими перекрывающимися неслоистыми subviews на MacOS 10.7+. В моем приложении просмотры использовались для отображения информации о выбранном графическом объекте (кадр выбора, контрольные точки масштабирования и т.д.), Поэтому у них была некоторая анимация, которую они ввели в моем случае.

Кажется, что совпадающие братья и сестры действительно прекрасно работают даже без слоя, но в более простых случаях. У меня была куча анимированных просмотров, каждая с собственным таймером - и она щелкнула. Я нашел два решения: либо включите слои, либо синхронизировать анимацию, перейдя на один общий таймер и обновив все виды в тот же момент.

По крайней мере, этот трюк помог в моем приложении, так как я не хотел использовать слои.

Ответ 5

Братьям NSView обычно разрешается перекрываться. Одна вещь, которая может поразить вас, - это то, как работает NSScrollView по умолчанию. Когда у вас есть ванильный NSScrollView, перекрываемый взглядами сестры, вещи ломаются.

Это из-за NSClipView, который только рисует часть прокрутки и копирует материал, который не изменился. Когда у вас есть взгляды сестры, которые перекрывают вид прокрутки, эта оптимизация не работает, и представления, похоже, прокручиваются, хотя они являются только родными братьями.

Чтобы сделать перекрывающиеся представления sibling работать даже тогда, когда они не поддерживаются с помощью слоя, вам необходимо отключить эту оптимизацию:

[scrollView.contentView setCopiesOnScroll:NO];