每次打开视图时模糊效果都会重复

Blur effect duplicates everytime I open a view

我有一个 UITabBar,其中包含 "main" 和 "profile" 部分。在配置文件中,我使用了一个充满整个屏幕的背景图像,具有模糊效果。它工作得很好。当我返回主界面并再次返回配置文件时,会在第一个模糊效果上添加一个新的模糊效果。

如果我把设置模糊效果对应的代码放在viewDidLoad()中就可以正常工作,只添加一次效果。但是有一个问题,模糊效果并没有填满整个屏幕。我想这是因为在 viewDidLoad 中没有人知道 imageView 的框架,所以它填充了图像的 3/4 部分。

我的问题是:我该如何解决这个问题?假设它是由于图像帧引起的,目前未知。如何设置框架尺寸?

如果您认为它是由其他原因引起的,请告诉我可能是什么原因。

这是我正在使用的模糊代码?

self.picBlurView = UIVisualEffectView(effect: self.picBlur)
self.picBlurView.frame = self.profileSubView.bounds    
self.profileSubView.addSubview(self.picBlurView)

非常感谢。

您可以在 class 中设置一个标志,例如“_alreadyBlurred”。您在 viewDidLoad.

中将其设置为 NO

viewWillAppear中,检查是否flag == NO,如果是,则制作模糊效果并设置flag = YES

然后在下一次调用中它不会添加另一个模糊效果,并且在这个方法中你知道帧。

代码:

在 viewWillAppear 中:

if (_myBlurView == nil) {
    ....
    // do blur effect and add
    ....
}

由于您已经将 picBlurView 作为 属性,只需检查它是否存在。如果不存在,则创建它并添加它。否则什么都不做。在 viewWillAppear.

中执行此操作
if (self.picBlurView == nil){
  self.picBlurView = UIVisualEffectView(effect: self.picBlur)
  self.picBlurView.frame = self.profileSubView.bounds
  self.profileSubView.addSubview(self.picBlurView)
}

您可能想要实现方法 willAnimateRotationToInterfaceOrientation 以便在发生旋转时重新应用模糊效果(如果您认为这很重要)。在这里你只需替换你最初添加的那个。