iPhone SDK - 磨砂玻璃(iOS 7模糊)效果

问题描述:

我试图在UIImageView中应用磨砂玻璃效果。iPhone SDK - 磨砂玻璃(iOS 7模糊)效果

我试图执行我发现的in this question,但结果不可接受。 我想是这样的:

Frosted Glass Effect

任何想法?

UPDATE:

此外,我们可以看到的iOS 7使用这种效果在很多地方。我们如何重现它?

+0

这里的解决方案与UIToolbar: http://*.com/a/19506076/774394 – 2013-10-21 22:51:56

+0

我在编辑2中提到过类似的东西 - 它使用UIToolbar也是 – 2013-10-22 08:40:20

+0

是的你是对的。但是这个解决方案在UIView动画的动画框/边界上起作用。 – 2013-10-22 15:47:28

约CoreImage一个很好的教程在这里,展示如何应用滤镜和更多:

http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5

更新1

那么的一点点研究之后,我最终发现,与OS X版本的库相比,iOS的核心映像仍然不完整。所以我搜索了很多,我找到了两个解决方案,其中一个更简单,另一个更广泛和更复杂的库。

因此,例如,在几行,我可以得到我想要的结果(其中originalImage是UIImage的应用效果):

GPUImageGaussianBlurFilter *blurFilter = [[GPUImageGaussianBlurFilter alloc] init]; 
blurFilter.blurSize = 2; 
UIImage *blurImage = [blurFilter imageByFilteringImage:resizedImage]; 

更新2

在苹果宣布iOS 7之后,一些开发人员发现了一种解决方法,与Apple在默认的iOS应用程序中所做的相同,因为Apple没有为此提供API。 The simplest and better solution, in my opinion, is this one。为什么我认为这是最好的?因为即使背后的某些视图发生移动,模糊效果仍然很好,因为我们预计它会起作用。但是,请记住,它依赖于iOS 7 SDK才能工作,如果Apple更改UIToolbar,则可能会有风险。

更新3

苹果提到,在WWDC 2013(会话226 - iOS上实现引人入胜的用户界面),他们将提供UIImage的一个类别类,称为的UIImage + ImageEffects(我GOOGLE了它,and found here,但它在Developer Portal - search for UIImageEffects in the search box中可用)。使用此类别,可以使用多种方法(光线,黑暗,具有特定颜色等)在静态UIImage中应用模糊。另外,昨天I saw this component,发现它很有趣,因为你可以在一个框架中应用效果(基于上述类别)。

UPDATE 4

最后,在iOS 8日,苹果发布了新的类,可以很容易地做直播模糊。使用UIVisualEffectUIVisualEffectView,您可以快速将实时模糊添加到您的应用程序。 Here is a good tutorial from Ryan Nystrom on how to use those classes (and in blur in general)

+4

您可能还需要将高斯模糊与白色混合,才能得到您上面要看的外观,并且我将在某个时刻为此进行专门的过滤。另外,我正要试验纹理磨砂玻璃,就像这款着色器提供的一样:http://coding-experiments.blogspot.com/2010/06/frosted-glass.html – 2012-07-23 16:15:51

+0

我该怎么做?我觉得我没有阅读文档的地方=(也无法编译文档 – 2012-07-24 07:43:16

+0

对于自定义过滤器,最好的参考是看看其他过滤器是如何工作的,例如,上面连接的纹理玻璃会可以通过使用自定义片段着色器来完成,因此您需要创建一个新的自定义过滤器(使用类似于模板的方式)并修改它们在OpenGL ES中提供的片段着色器。对于明亮的模糊,您可能能够链接亮度滤镜的高斯模糊,或者最差的情况下,为亮化步骤创建一个具有自定义片段着色器的滤镜组。核心文档位于Readme.md文件中。 – 2012-07-24 14:01:31

看一看the Core Image Programming Guide。看起来好像stylize filterblur filter可能适合您的需求。我以前从未与Core Image合作过,但我认为可能会有一些涉及他们的良好WWDC会话。该文档有a basic piece of sample code here

+0

它看起来像iOS没有所有的OS X的过滤器。你可以通过代码NSArray * properties = [CIFilter filterNamesInCategory:kCICategoryBuiltIn]; NSLog(@“%@”,属性);' – 2012-07-22 16:01:21

+0

没有深入细节,你有没有在iOS 6上运行该代码? – Moshe 2012-07-22 19:25:36

+0

还没有。检查我自己的答案 - 解决! – 2012-07-22 21:06:00

解决方案适用于iOS 7和8,而无需使用CoreImage或CoreGraphics中的所有:

- (void)addBlurToView:(UIView *)view { 
    UIView *blurView = nil; 

    if([UIBlurEffect class]) { // iOS 8 
     UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]; 
     blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 
     blurView.frame = view.frame; 

    } else { // workaround for iOS 7 
     blurView = [[UIToolbar alloc] initWithFrame:view.bounds]; 
    } 

    [blurView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [view addSubview:blurView]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]]; 
} 

(假设你不针对iOS版比7旧版本;如果你是,你必须测试else区块中的iOS版本)

此解决方案适用于任何视图,而不仅适用于图像。

+0

非常有用的答案,可以很容易地为ios 7和8实现,只是一个问题,假设我不断添加和删除这个模糊的视图,我应该删除每次“从超级视图中删除视图”时添加的约束“ (我使用这个代码再次将它添加回来,所以我知道约束不断添加) – Pochi 2014-10-03 03:39:28

+0

为什么不简单地隐藏它而不是删除它? – KPM 2014-10-03 08:17:43

+2

极好的例子。很棒。 – 2014-11-01 07:34:15

使用UIImageEffects

如果你申请的时候模糊想要更多的控制,你可以利用苹果的UIImageEffects(通过他们的示例代码可用)的。

您可以从苹果的开发库复制代码为UIImageEffectsBlurring and Tinting an Image

这里是如何使用它:

#import "UIImageEffects.h" 
... 

self.yourImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];