Скрытие / Удаление / Исчезновение CALayer стирание содержимого NSView - PullRequest
1 голос
/ 13 сентября 2010

Моя ситуация:

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

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

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

Достаточно просто. Итак, все, что я пытался сделать, это проверить, правильно ли он скрывается / удаляется. Затем возникла проблема. Любая попытка скрыть, удалить или уменьшить черный слой или уменьшить его прозрачность до 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];

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

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

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

1 Ответ

1 голос
/ 10 октября 2010

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

...