2010-09-13 3 views
1

Моя ситуация:Скрытие/удаление/Fading CALayer стирание содержимого NSView

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

Для целей тестирования, я помещаю небольшую полупрозрачную черную CALayer покрывающую лишь некоторые/части подвидов (элементы управления) в главном окне просмотра контента, как так:

(DOH, были скриншоты, но не может вы должны будете использовать свое воображение.)

Простой достаточно. Итак, все, что я пытался сделать, это проверить, что он скрывает/удаляет себя должным образом. Тогда возникла проблема. Любая попытка скрыть, удалить или уменьшить черный слой или уменьшить его прозрачность до 0 приводит к стиранию всех подзонов окна, в результате чего выглядит так:

(окно с полностью пустой серым цветом [окно по умолчанию BG цвет] вид контента)

Вот мясо кода, в главном вызове приложения, который имеет ссылку на главном окне:

// I set up my main view in a nib, which I load and will add 
    // to the app window as the main content view 
    NSViewController * controller = [[NSViewController alloc] 
    initWithNibName:@"InterfaceTesting" bundle:nil]; 

    NSView * view = [controller view]; 

    // enable layers, grab root 
    [view setWantsLayer:YES];  
    CALayer * rootLayer = [view layer]; 

    // set up black square 
    CALayer * blackLayer = [CALayer layer]; 
    [blackLayer setFrame:NSMakeRect(150, 150, 100, 100)]; 
    [blackLayer setBackgroundColor:CGColorCreateGenericRGB(0,0,0,0.5)]; 
    [rootLayer addSublayer:blackLayer]; 

    // hide all sublayers of root (ie the black square)  
    for (CALayer * layer in [[view layer] sublayers]) 
     [layer setHidden:YES]; 

    // add to main window 
    [self.window setContentView:view]; 

Как упоминалось ранее, замена [слой setHidden: ДА] с [layer setOpacity: 0] имеет тот же эффект от стирания представления содержимого, как и удаление черного слоя в целом (по вызывая removeFromSuperlayer, а также пытаясь установить его superlayer в nil). Еще интереснее, если я установил непрозрачность квадрата черного подслоя на что-то между 0 и 1 - 0,5, скажем - тогда все непрозрачности подсмотров содержимого представят соответственно.

Так что я довольно озадачен здесь, так как я не понимаю, почему скрытие/удаление или уменьшение непрозрачности на маленьком черном CALayer влияет на все подзоны в представлении, в котором оно входит, даже те, обложка. Буду признателен за любую оказанную помощь.

Редактирование: Хорошо, что я обнаружил, что верхний слой contentView на самом деле имеет подуровень не только для черного квадрата, который я добавил вручную, но и для каждого поднабора (независимо от того, происходит ли это из ниба или создается вручную после загрузки вид из ниба), следовательно, почему все они исчезали/исчезали, когда я думал, что просто работаю на черном ящике. Но то, что я до сих пор не знаю, - это то, почему есть слои для всех подзонов, откуда они пришли, и как их избавиться (опять же, все попытки удалить их - через removeFromSuperlayer, установка на nil и т. Д. - сбой.

ответ

1

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

Смежные вопросы