• iOS进入后台模糊界面


    iOS进入后台模糊界面

    • 两种方式,一种是截取当前界面,做高斯模糊
    • 一种是直接搞一个模糊界面盖在window最上层,推荐这种,方便性能好

    App后台高斯模糊

    1、截取当前界面模糊

    • 这种方法比较耗性能,毕竟要截图,查找window,再模糊处理。
    - (void)screenShot {
        //  保证每次截取的都是最新的界面
        if(self.screenShotImageV) {
    		[self.screenShotImageV removeFromSuperview];
    	}
    	CGSize imageSize = CGSizeZero;
    	//屏幕朝向
    	UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    	if (UIInterfaceOrientationIsPortrait(orientation))
    		imageSize = [UIScreen mainScreen].bounds.size;
    	else
    		imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
    
    	UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
    	CGContextRef context = UIGraphicsGetCurrentContext();
    	//按理应取用户看见的那个window
    
    	for (UIWindow *window in [[UIApplication sharedApplication] windows])
    	{
    		CGContextSaveGState(context);
    		CGContextTranslateCTM(context, window.center.x, window.center.y);
    		CGContextConcatCTM(context, window.transform);
    		CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);
    		if (orientation == UIInterfaceOrientationLandscapeLeft)
    		{
    			CGContextRotateCTM(context, M_PI_2);
    			CGContextTranslateCTM(context, 0, -imageSize.width);
    		}
    		else if (orientation == UIInterfaceOrientationLandscapeRight)
    		{
    			CGContextRotateCTM(context, -M_PI_2);
    			CGContextTranslateCTM(context, -imageSize.height, 0);
    		} else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
    			CGContextRotateCTM(context, M_PI);
    			CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
    		}
    
    		if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
    		{
    			[window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
    		}
    		else
    		{
    			[window.layer renderInContext:context];
    		}
    		CGContextRestoreGState(context);
    	}
    	//截屏图片
    	UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    	//截屏图片t处理后
    	UIImage *gaussianImage = [self coreGaussianBlurImage:image blurNumber:30];
    	//生成控件
    	UIImageView *bgImgv = [[UIImageView alloc] initWithImage:gaussianImage];
    	bgImgv.frame = CGRectMake(0, 0, imageSize.width, imageSize.height);
    	self.screenShotImageV = bgImgv;
    }
    
    /**
       高斯模糊 处理
    
       @param image 要处理的image
       @param blur 模糊度
       @return 处理后的image
     */
    - (UIImage *)coreGaussianBlurImage:(UIImage * _Nonnull)image blurNumber:(CGFloat)blur {
    
    	if (!image) {
    		return nil;
    	}
    	CIContext *context = [CIContext contextWithOptions:nil];
    	CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
    
    	CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    	[filter setValue:inputImage forKey:kCIInputImageKey];
    	[filter setValue:[NSNumber numberWithFloat:blur] forKey:@"inputRadius"];
    	CIImage *result = [filter valueForKey:kCIOutputImageKey];
    	CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];
    
    	UIImage *blurImage = [UIImage imageWithCGImage:cgImage];
    
    	CGImageRelease(cgImage);
    
    	return blurImage;
    
    }
    
    //显示window
    - (void)show {
        [self screenShot];
        [[UIApplication sharedApplication].delegate.window addSubview:self.screenShotImageV];
        [[UIApplication sharedApplication].delegate.window bringSubviewToFront:self.screenShotImageV];
    }
    //隐藏window
    - (void)hidden {
    	if(self.screenShotImageV) {
    		[self.screenShotImageV removeFromSuperview];
    	}
    }
    
    

    2、通用界面模糊

    • 这种比较方便,只需要创建一个界面即可,和具体界面无关。
    /**
     打开后台快照遮罩
     */
    - (void)executePresentBlurSnapshot
    {
        if (!self.effectView) {
            UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
            UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];
            effectView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
            self.effectView = effectView;
        }
        [[UIApplication sharedApplication].delegate.window addSubview:self.effectView];
        [[UIApplication sharedApplication].delegate.window bringSubviewToFront:self.effectView];
    }
    
    /**
     关闭后台快照遮罩
     */
    - (void)executeDismissBlurSnapshot
    {
        if (self.effectView) {
            [self.effectView removeFromSuperview];
        }
    }
    
    • 在delegate控制显示和隐藏
    - (void)applicationWillResignActive:(UIApplication *)application {
        [[LQAboveBackgroundView sharedInstance] show];
    }
    
    - (void)applicationWillEnterForeground:(UIApplication *)application {
        [[LQAboveBackgroundView sharedInstance] hidden];  
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        [[LQAboveBackgroundView sharedInstance] hidden];
    }
    
  • 相关阅读:
    python:时间格式转化
    python:将时间戳格式化为yyyyMMdd hh:mm:ss
    Oracle 实现表中id字段自增长
    django:将query-set类型转为json类型
    mysql:获取某个表的所有字段
    Navicat连接Mysql8.0.11出现1251错误
    Java垃圾回收(GC)机制详解
    Mybatis学习总结(九)——查询缓存
    Mybatis学习总结(八)——延迟加载
    Mybatis学习总结(七)——调用存储过程
  • 原文地址:https://www.cnblogs.com/songliquan/p/16038774.html
Copyright © 2020-2023  润新知