Ios 如何使用UIVisualEffectView模糊图像?

Ios 如何使用UIVisualEffectView模糊图像?,ios,objective-c,uiview,uikit,uivisualeffectview,Ios,Objective C,Uiview,Uikit,Uivisualeffectview,有人能举一个小例子,对图像进行模糊处理吗?我已经试着找出代码有一段时间了:(在obj c还是新的 UIVisualEffectView提供了一个简单的抽象,而不是复杂的抽象 视觉效果。根据所需效果,结果可能会有所不同 影响视图后面分层的内容或添加到视图中的内容 contentView 将UIVisualEffectView应用于现有视图以应用模糊或 现有视图的振动效果。添加 UIVisualEffectView若要查看层次结构,请将任何子视图添加到 UIVisualEffectView的cont

有人能举一个小例子,对图像进行模糊处理吗?我已经试着找出代码有一段时间了:(在obj c还是新的

UIVisualEffectView
提供了一个简单的抽象,而不是复杂的抽象 视觉效果。根据所需效果,结果可能会有所不同 影响视图后面分层的内容或添加到视图中的内容 contentView

UIVisualEffectView
应用于现有视图以应用模糊或 现有视图的振动效果。添加 UIVisualEffectView若要查看层次结构,请将任何子视图添加到
UIVisualEffectView的contentView
。不要将子视图直接添加到
UIVisualEffectView
本身


只需将此模糊视图放在imageView上。以下是Objective-C中的一个示例:

UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

visualEffectView.frame = imageView.bounds;
[imageView addSubview:visualEffectView];
// Blur effect
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
[blurEffectView setFrame:self.view.bounds];
[self.view addSubview:blurEffectView];

// Vibrancy effect
UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
[vibrancyEffectView setFrame:self.view.bounds];

// Label for vibrant text
UILabel *vibrantLabel = [[UILabel alloc] init];
[vibrantLabel setText:@"Vibrant"];
[vibrantLabel setFont:[UIFont systemFontOfSize:72.0f]];
[vibrantLabel sizeToFit];
[vibrantLabel setCenter: self.view.center];

// Add label to the vibrancy view
[[vibrancyEffectView contentView] addSubview:vibrantLabel];

// Add the vibrancy view to the blur view
[[blurEffectView contentView] addSubview:vibrancyEffectView];
和斯威夫特:

var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))    

visualEffectView.frame = imageView.bounds

imageView.addSubview(visualEffectView)

以下是如何在UIVisualEffectView中使用UIVibrancyEffect和UIBlurEffect

目标C:

UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

visualEffectView.frame = imageView.bounds;
[imageView addSubview:visualEffectView];
// Blur effect
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
[blurEffectView setFrame:self.view.bounds];
[self.view addSubview:blurEffectView];

// Vibrancy effect
UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
[vibrancyEffectView setFrame:self.view.bounds];

// Label for vibrant text
UILabel *vibrantLabel = [[UILabel alloc] init];
[vibrantLabel setText:@"Vibrant"];
[vibrantLabel setFont:[UIFont systemFontOfSize:72.0f]];
[vibrantLabel sizeToFit];
[vibrantLabel setCenter: self.view.center];

// Add label to the vibrancy view
[[vibrancyEffectView contentView] addSubview:vibrantLabel];

// Add the vibrancy view to the blur view
[[blurEffectView contentView] addSubview:vibrancyEffectView];
Swift 4:

    // Blur Effect
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    view.addSubview(blurEffectView)

    // Vibrancy Effect
    let vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect)
    let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
    vibrancyEffectView.frame = view.bounds

    // Label for vibrant text
    let vibrantLabel = UILabel()
    vibrantLabel.text = "Vibrant"
    vibrantLabel.font = UIFont.systemFont(ofSize: 72.0)
    vibrantLabel.sizeToFit()
    vibrantLabel.center = view.center

    // Add label to the vibrancy view
    vibrancyEffectView.contentView.addSubview(vibrantLabel)

    // Add the vibrancy view to the blur view
    blurEffectView.contentView.addSubview(vibrancyEffectView)

您还可以使用界面生成器为简单情况轻松创建这些效果。由于视图的z值取决于它们在文档大纲中列出的顺序,因此您可以在要模糊的视图之前将
UIVisualEffectView
拖到文档大纲上。这会自动创建嵌套的
UIView
,它是给定
UIVisualEffectView
contentView
属性。在该视图中嵌套要显示在模糊顶部的内容

您还可以轻松利用Vibrance
UIVisualEffect
,它将在默认启用Vibrance的文档大纲中自动创建另一个嵌套的
UIVisualEffectView
。然后,您可以将标签或文本视图添加到嵌套的
UIView
(同样,使用
UIVisualEffectView
contentView
属性),以实现与“>slide to unlock”UI元素相同的效果


我更喜欢通过故事板创建视觉效果-没有用于创建或维护UI元素的代码。它也为我提供了全面的横向支持。我已经做了一个小演示,演示了如何将UIVisualEffects与模糊和活力结合使用


如果有人想要Swift的答案:

var blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) // Change .Dark into .Light if you'd like.

var blurView = UIVisualEffectView(effect: blurEffect)

blurView.frame = theImage.bounds // 'theImage' is an image. I think you can apply this to the view too!
更新:



到目前为止,它在IB下可用,因此您无需为其编写任何代码:)

非常感谢!我忘记了设置框架:(谷歌上还没有关于视觉的内容,因此这应该是第一个搜索词:)最好希望API不会改变!这就是讨论尚未发布的Apple API可能会很棘手的原因之一。例如,一些UIKit Dynamics API在测试版和发布版之间会略有变化。没有什么大的变化,但它们会破坏针对原始API编写的任何示例代码。是否有任何方法可以使模糊变为动画?@B.s.Y你可以为视觉效果视图的alpha设置动画。Boom.UIBlurEffect非常棒,但请注意,它在像iPad2这样的旧设备上不起作用-我花了几个小时试图弄清楚为什么它只在我的屏幕上放置一个半透明层而不模糊-这都是因为我在一个旧设备上进行测试。即使没有子类化,该解决方案也可以工作,只需定义扩展UILabel{override func tintColorDidChange(){textColor=tintColor;super.tintColorDidChange()}Apple似乎已经修复了该漏洞。iOS 8 beta 2中不再需要子类/扩展解决方案。谢谢。我已经测试并确认了该漏洞修复方案,并编辑了答案。我试图将其添加到我的视图中,但每次我呈现视图时,它都会一次又一次地模糊,直到我获得白色背景…我正在使用remo删除视图veFromSuperView在我关闭它之后,但我得到了相同的结果…有什么想法吗?@GeorgeAsda与其调用
removeFromSuperView
,不如将
[self.visualEffectView setHidden:NO]
?分配并添加到视图比隐藏或显示更昂贵。您能确认显示的内容实际上是模糊的吗?我的图像(您在层次结构中称之为“背景照片”)只是在模糊样式下变暗:暗半透明视图。(Xcode 6.01发行版,使用iOS模拟器)“只是变暗了”是什么意思?你不认为它模糊了吗?好的,我几小时后会看一看。谢谢!你的背景照片上有一个视图层次结构,它在截图中被折叠了…我只是使用了UIImageView并为它分配了一张照片(绿色背景下的浅色狗——白色的腿和绿色的草之间的清晰定义在视觉效果视图覆盖时与不覆盖时一样清晰)。我已经看到,将模糊类型更改为深色,标签将变为白色…添加一些文本,说明您的答案如何帮助解决发布的问题。请小心将视图添加到
UIVisualEffectView
contentView
,如果要将其添加到子视图并设置其框架,请不要忘记在viewD中更新框架idLayoutSubviews以确保旋转有效。