【问题标题】:Apply blur effect to a view before presenting on IOS 7/8?在 IOS 7/8 上呈现之前对视图应用模糊效果?
【发布时间】:2026-01-09 06:35:02
【问题描述】:

我正在开发一个涉及隐私的应用,我想在应用启动时模糊主屏幕(然后我要求进行本地身份验证等)

我遇到的主要问题是我不知道如何在视图显示之前访问它。 如果我尝试在- (void)viewDidLoad 内获取视图,则不应用模糊效果(因为视图尚不存在),如果我尝试访问- (void)viewDidAppear:(BOOL)animated 内的视图,则非模糊视图会出现一秒钟应用了模糊效果。

有没有办法在它显示在屏幕上之前获取视图并应用模糊效果?

我用于应用模糊效果的代码是:

UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
UIVisualEffectView * visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
visualEffectView.frame = self.view.window.bounds;
[UIApplication.sharedApplication.keyWindow.subviews.lastObject addSubview:visualEffectView];

提前致谢。

【问题讨论】:

  • 你试过- (void)viewWillAppear:(BOOL)animated吗?此外,您应该最初设计带有模糊层的视图,并在不再需要它时将其隐藏。
  • 也许在 viewWillAppear 中隐藏主视图中的内容(添加到子视图并隐藏)?
  • 或许可以试试 viewWillDisplay。
  • @jeffamaphone - (void)viewWillAppear:(BOOL)animated 不起作用,同样的问题。视图尚未渲染,因此未应用模糊。
  • @Yanchi 我知道还有其他解决方案,比如隐藏视图或覆盖某些东西,但我喜欢模糊效果并想使用它。

标签: ios objective-c


【解决方案1】:

不知道为什么,但在主线程中获取和模糊视图工作正常,即使在 - (void)viewDidLoad 中也是如此。模糊是即时的,非模糊版本根本不显示。

    dispatch_async(dispatch_get_main_queue(), ^{
        //blur here
    });

现在它工作正常,即使从 AppDelegate 调用!

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // ...
    [self addBlurLayer];
    // ...
    return YES;
}

-(void)addBlurLayer
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if(visualEffectView==nil)
        {
            UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
            visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
            visualEffectView.frame = self.window.bounds;
            [UIApplication.sharedApplication.keyWindow.subviews.lastObject addSubview:visualEffectView];
        }
    });
}

【讨论】:

    最近更新 更多