Размытый фон под NSView

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

Кажется, я не могу справиться с этим сразу. Все, что я пытаюсь (в лучшем случае), стирает содержимое представления, а не то, что внизу.

Ответ 1

Посмотрите эту статью о Cocoanetics, она дает вам некоторые инструкции по правильной настройке NSView с размытым фоном: http://www.cocoanetics.com/2013/10/blurring-views-on-mac/

В Github также есть класс RMBlurredView: https://github.com/raffael/RMBlurredView

Идея этого заключается в использовании NSView с поддержкой слоев с CIGaussianBlur CIFilter, примененным к свойству backgroundFilters. Все важные флаги установлены правильно в указанном классе.

Ответ 2

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

Вы можете использовать CALayers. Объявите корневой слой и добавьте фоновое изображение в качестве подуровня. Поместите "содержимое" в подвью с прозрачным фоном. (В противном случае "содержимое" , вероятно, будет затенено размытым подуровнем.)

Здесь неполный (и непроверенный) код для настройки подслоя:

 // Set up the root layer.
[[self.aViewController view] setLayer:[CALayer layer]];
[[self.aViewController view] setWantsLayer:YES];
// Set up a sublayer.
CALayer *blurredSublayer = [CALayer layer];
 NSRect rectOfView = [self.aViewController view] frame];
 blurredSublayer.bounds = rectOfView;
// Views are usually positioned from their lower left corner, but CALayers are positioned from their center point.
blurredSublayer.position = CGPointMake(rectOfView.size.width/2, rectOfView.size.height/2);

 // Set the sublayer contents property to the image you've chosen. You might need to do the scaling when you set up the CGImageRef used by the contents property. (I haven't done this; I leave it to you.)

 // Add the sublayer to the view root layer.
[self.aViewController.view.layer addSublayer:blurredSublayer];

 // You'll probably want to save expense by calling setWantsLayer:NO for the contents-bearing subview, since it will have been turned on when you set up the superview root layer.

Или может быть проще использовать CGContext. Но с CALayer у вас есть свойство zPosition, которое вы упомянули.

P.S. Использование "содержимого" и "супервизора" и "подуровня" делает структуру запутанной. Здесь описательная иерархия. Первый элемент находится внизу и последним именем сверху, как это было бы в IB:

  • супервизор с корневым слоем
  • скрытый подслой верхнего уровня (свойство содержимого подуровня - это увеличенное изображение)
  • subview/s (текстовые поля или что-то еще, что вы имели в виду как "содержимое" )