在NSView下面的模糊的背景

时间:2011-05-13 19:40:17

标签: objective-c cocoa

我一直在四处寻找,但我找不到答案。我正在尝试制作一个能够正常显示其内容的视图,但是在它下面(在z轴上)的任何东西都会模糊不清。

我似乎无法立即做到这一点。我尝试的任何东西(充其量)都会模糊视图的内容,而不是下面的内容。

2 个答案:

答案 0 :(得分:2)

查看有关Cocoanetics的这篇文章,它为您提供了一些如何正确设置具有模糊背景的NSView 的说明:http://www.cocoanetics.com/2013/10/blurring-views-on-mac/

Github上还有一个RMBlurredView课程:https://github.com/raffael/RMBlurredView

它背后的想法是使用一个支持图层的NSView,并在CIGaussianBlur属性上应用backgroundFilters CIFilter。所有重要的标志都在上面提到的类中正确设置。

答案 1 :(得分:0)

如果使用的图像明显小于视图的图像并向上缩放图像,则会模糊。

您可以使用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's 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's 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's root layer.

或者使用CGContext可能更容易。但是使用CALayer,您可以获得所提到的zPosition属性。

P.S。使用“内容”和“超级视图”和“子层”使结构混乱。这是一个描述性的层次结构。第一个命名的项目位于底部,最后一个命名位于顶部,就像在IB中一样:

  • 根层的超级视图
  • superview的模糊子图层(子图层的内容属性是按比例放大的图像)
  • subview / s(文本字段或任何您想到的“内容”)