Крис, единственное решение - использовать CALayers. Это определенно единственное решение.
NSViews просто повреждены в OSX (сентябрь 2010): братья и сестры не работают должным образом. Один или другой случайным образом появятся сверху.
Просто повторюсь, проблема в братьях и сестрах .
Чтобы проверить это: используйте NSViews и / или nsimageviews. Создайте приложение с одним большим изображением (скажем, 1000x1000). В представлении поместите три или четыре маленьких изображения / NSViews здесь и там. Теперь поместите еще одно большое изображение 1000x1000 сверху. Создайте и запустите приложение несколько раз - вы увидите, что оно сломано. Часто нижние (маленькие) слои появляются поверх большого покрывающего слоя. если вы включите поддержку слоев на NSViews, это не поможет, независимо от того, какую комбинацию вы пытаетесь. Так что это окончательный тест.
Вы должны отказаться от NSViews и использовать CALayers, и все.
Единственное раздражение в CALayers заключается в том, что вы не можете использовать IB для настройки своих вещей. Вы должны установить все позиции слоя в коде,
yy = [CALayer layer];
yy.frame = CGRectMake(300,300, 300,300);
Создайте только один NSView, единственной целью которого является удержание вашего первого CALayer (возможно, называемого «задним»), а затем просто поместите все ваши CALayer в тыл.
rear = [CALayer layer];
rear.backgroundColor = CGColorCreateGenericRGB( 0.75, 0.75, 0.75, 1.0 );
[yourOnlyNsView setLayer:rear]; // these two lines must be in this order
[yourOnlyNsView setWantsLayer:YES]; // these two lines must be in this order
[rear addSublayer:rr];
[rear addSublayer:yy];
[yy addSublayer:s1];
[yy addSublayer:s2];
[yy addSublayer:s3];
[yy addSublayer:s4];
[rear addSublayer:tt];
[rear addSublayer:ff];
тогда все работает совершенно идеально, вы можете вкладывать и группировать все, что захотите, и все это работает безупречно, когда все правильно отображается выше / ниже всего, что должно отображаться выше / ниже, независимо от того, насколько сложна ваша структура. Позже вы можете делать что угодно со слоями или перетасовывать вещи типичным образом,
-(void) shuff
{
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0.0f]
forKey:kCATransactionAnimationDuration];
if ..
[rear insertSublayer:ff below:yy];
else
[rear insertSublayer:ff above:yy];
[CATransaction commit];
}
(Единственная причина для раздражающей обертки «в ноль секунд» для всего, что вы делаете, состоит в том, чтобы предотвратить анимацию, которая предоставляется вам бесплатно - если вы не хотите анимацию!)
Кстати в этой цитате от Apple,
По соображениям производительности, Какао делает
не применять стрижку среди братьев и сестер
взгляды или гарантия правильная
недействительность и поведение при рисовании, когда
взгляды братьев и сестер совпадают.
Их следующее предложение ...
Если вы хотите, чтобы изображение отображалось в
перед другим видом, вы должны сделать
вид спереди подпредставление (или
потомок) вид сзади.
В значительной степени бессмысленно (вы не можете обязательно заменить братьев и сестер на sub; и очевидная ошибка, описанная в тесте выше, все еще существует).
Так что это CALayers! Наслаждайтесь!