iOS 7上的App Store应用使用磨砂玻璃效果,可以看到后面的视图。这是使用iOS 7内置的API还是自定义代码。我希望它会是前者,但我在文档中看不到任何明显的参考。诸如(在模式视图上设置alpha属性)之类的显而易见的事情似乎没有任何效果。
要查看示例,请打开App Store应用程序,然后按右上角的按钮。
Answers:
随着iOS 8.0的发布,不再需要获取图像并对其进行模糊处理。正如Andrew Plummer所指出的,可以将UIVisualEffectView与UIBlurEffect一起使用。
UIViewController * contributeViewController = [[UIViewController alloc] init];
UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *beView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
beView.frame = self.view.bounds;
contributeViewController.view.frame = self.view.bounds;
contributeViewController.view.backgroundColor = [UIColor clearColor];
[contributeViewController.view insertSubview:beView atIndex:0];
contributeViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:contributeViewController animated:YES completion:nil];
在iOS 8之前可以使用的解决方案
我想扩展rckoenes的答案:
如强调的那样,您可以通过以下方式创建此效果:
听起来很多工作,但实际上很简单:
1.创建一个UIView类别并添加以下方法:
-(UIImage *)convertViewToImage
{
UIGraphicsBeginImageContext(self.bounds.size);
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
2.使用Apple的“图像效果”类别(下载)制作当前视图的图像并使其模糊
UIImage* imageOfUnderlyingView = [self.view convertViewToImage];
imageOfUnderlyingView = [imageOfUnderlyingView applyBlurWithRadius:20
tintColor:[UIColor colorWithWhite:1.0 alpha:0.2]
saturationDeltaFactor:1.3
maskImage:nil];
3.将其设置为覆盖的背景。
-(void)viewDidLoad
{
self.view.backgroundColor = [UIColor clearColor];
UIImageView* backView = [[UIImageView alloc] initWithFrame:self.view.frame];
backView.image = imageOfUnderlyingView;
backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
[self.view addSubview:backView];
}
UIModalPresentationOverCurrentContext
。请参阅下面的Andrew Plummer,mxcl和Andrey Konstantinov的答案。
刚刚在Swift中重新实现了Sebastian Hojas的解决方案:
1.创建一个UIView扩展并添加以下方法:
extension UIView {
func convertViewToImage() -> UIImage{
UIGraphicsBeginImageContext(self.bounds.size);
self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
return image;
}
}
2.使用Apple的Image Effect制作当前视图的图像并使其模糊(我在Swift中找到了此实现的重新实现:SwiftUIImageEffects
var imageOfUnderlyingView = self.view.convertViewToImage()
imageOfUnderlyingView = imageOfUnderlyingView.applyBlurWithRadius(2, tintColor: UIColor(white: 0.0, alpha: 0.5), saturationDeltaFactor: 1.0, maskImage: nil)!
3.将其设置为覆盖的背景。
let backView = UIImageView(frame: self.view.frame)
backView.image = imageOfUnderlyingView
backView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
view.addSubview(backView)
我认为这是模态视图控制器最简单的解决方案,它可以将所有内容叠加在一起,并具有良好的模糊效果(iOS8)
UIViewController * contributeViewController = [[UIViewController alloc] init];
UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *beView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
beView.frame = self.view.bounds;
contributeViewController.view.frame = self.view.bounds;
contributeViewController.view.backgroundColor = [UIColor clearColor];
[contributeViewController.view insertSubview:beView atIndex:0];
contributeViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:contributeViewController animated:YES completion:nil];
iOS 7 SDK中没有可用的API,它允许您“冻结”底层视图控制器。
我所做的是将底层视图渲染为图像,然后将其磨砂并将其设置为背景,以呈现的视图为背景。
Apple为此提供了一个很好的示例:https : //developer.apple.com/downloads/index.action?name=WWDC%202013
您想要的项目称为 iOS_RunningWithASnap
使用Interface Builder(基于Andrew Plummer的答案)实现此目标的一种更简单的方法(它还消除了Andrews答案中出现的副作用):
UIViewController *fancyViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"yourStoryboardIDFOrViewController"];
fancyViewController.view.backgroundColor = [UIColor clearColor];
fancyViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:fancyViewController
animated:YES
completion:nil];
实际上,第二和第三行非常重要-否则控制器将闪烁然后变黑。
从iOS 8开始,此功能有效:
let vc = UIViewController()
vc.view = UIVisualEffectView(effect: UIBlurEffect(style: .Light))
vc.modalPresentationStyle = .OverFullScreen
let nc = UINavigationController(rootViewController: vc)
nc.modalPresentationStyle = .OverFullScreen
presentViewController(nc, animated: true, completion: nil)
关键是.OverFullScreen
标志,并确保viewControllers具有模糊的UIVisualEffectView作为第一个可见视图。
正如@rckoenes所说,Apple没有提供实现这种效果的框架。但是有些人已经建立了很好的替代方案,例如这样的替代方案:
在iOS 5和iOS 6上也可以使用的两种替代方法:
FXBlurView:https : //github.com/nicklockwood/FXBlurView
iOS RealtimeBlur:https://github.com/alexdrone/ios-realtimeblur
我已将模糊视图控制器的内容上传到[GitHub] [1]。它还带有segue子类,因此您可以在情节提要中使用它。
带有XIB支持的快速简便的解决方案,可用于老学校男孩 https://github.com/cezarywojcik/CWPopup
苹果公司针对这些效果发布了UIImageEffect类别。这些类别应手动添加到项目中,并且支持iOS7。
您可以使用UIToolbar作为背景。默认情况下,UIToolbar的高度为50px。在UIToolbar上添加自动布局约束。然后选择高度约束并进行修改。
层次结构如下所示:
UIView -> clear colour for background.
- UIToolbar
- Other contents.