iOS 7半透明模式视图控制器

iOS 7半透明模式视图控制器,ios,objective-c,uinavigationcontroller,ios7,presentmodalviewcontroller,Ios,Objective C,Uinavigationcontroller,Ios7,Presentmodalviewcontroller,iOS 7上的App Store应用程序使用磨砂玻璃效果,可以看到后面的视图。这是使用iOS 7内置的API还是自定义代码。我希望是前者,但我在文档中看不到任何明显的参考。显而易见的事情(比如在模态视图上设置alpha属性)似乎没有任何效果 要查看示例,请打开App Store应用程序并按下右上角的按钮 iOS 7 SDK中没有允许您“冻结”基线视图控制器的API 我所做的是将参考底图视图渲染为一个图像,然后对其进行磨砂,并将其设置为当前视图的背景 苹果提供了一个很好的例子: 正如@rckoe

iOS 7上的App Store应用程序使用磨砂玻璃效果,可以看到后面的视图。这是使用iOS 7内置的API还是自定义代码。我希望是前者,但我在文档中看不到任何明显的参考。显而易见的事情(比如在模态视图上设置alpha属性)似乎没有任何效果

要查看示例,请打开App Store应用程序并按下右上角的按钮


iOS 7 SDK中没有允许您“冻结”基线视图控制器的API

我所做的是将参考底图视图渲染为一个图像,然后对其进行磨砂,并将其设置为当前视图的背景

苹果提供了一个很好的例子:


正如@rckoenes所说,没有苹果提供的框架来实现这一效果。但有些人已经建立了很好的替代方案,例如:


在iOS 5和iOS 6上也适用的两种替代方法:

FXBlurView:


iOS RealtimeBlur:

我已将模糊视图控制器的照片上传到[GitHub][1]。它还附带了一个segue子类,因此您可以在故事板中使用它


存储库:

随着iOS 8.0的发布,不再需要获取图像和模糊图像。如前所述,您可以使用with


在iOS 8之前可用的解决方案

我想就rckoenes的回答作进一步说明:

正如所强调的,您可以通过以下方式创建此效果:

  • 将基础UIView转换为UIImage
  • 模糊图像
  • 将UIImage设置为视图的背景

  • 听起来需要做很多工作,但实际上做得相当直接:

    1。创建UIView的类别并添加以下方法:

    -(UIImage *)convertViewToImage
    {
        UIGraphicsBeginImageContext(self.bounds.size);
        [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return image;
    }
    
    extension UIView {
        func convertViewToImage() -> UIImage{
            UIGraphicsBeginImageContext(self.bounds.size);
            self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext();
    
            return image;
        }
    }
    
    2。制作当前视图的图像,并使用()将其模糊。

    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];
    }
    
    let backView = UIImageView(frame: self.view.frame)
    backView.image = imageOfUnderlyingView
    backView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
    view.addSubview(backView)
    
    快速简便的解决方案 有了XIB支持,您可以为老学童使用

    您可以将viewController添加为子viewController并创建自定义动画,而不是将其显示为modalView。然后,您只需在
    viewDidLoad
    中将viewController的默认视图更改为UIToolBar


    这将允许您尽可能接近地模拟appstore的模糊模式视图。

    自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
    标志,并确保ViewController具有第一个可见视图的模糊UIVisualEffectView。

    刚刚在Swift中重新实现了Sebastian Hojas解决方案:

    1。创建UIView扩展并添加以下方法:

    -(UIImage *)convertViewToImage
    {
        UIGraphicsBeginImageContext(self.bounds.size);
        [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return image;
    }
    
    extension UIView {
        func convertViewToImage() -> UIImage{
            UIGraphicsBeginImageContext(self.bounds.size);
            self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext();
    
            return image;
        }
    }
    
    2。制作当前视图的图像,并使用苹果的图像效果对其进行模糊处理(我在Swift中找到了这一点的重新实现:

    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];
    }
    
    let backView = UIImageView(frame: self.view.frame)
    backView.image = imageOfUnderlyingView
    backView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
    view.addSubview(backView)
    

    我认为这是一个模式视图控制器的最简单的解决方案,它可以用一个漂亮的模糊覆盖所有内容(iOS8)


    使用Interface Builder实现这一点(基于Andrew Plummer的答案)的更简单的方法(也消除了Andrews答案中出现的副作用):

    • 在IB中,将视觉效果视图添加到其他视图下的视图控制器中
    • 从视觉效果视图到顶部(父)视图进行顶部、底部、左侧、右侧约束,将所有约束设置为0
    • 设置模糊样式
    • 添加显示新fancy View控制器的代码:



    实际上,第二行和第三行非常重要,否则控制器将闪烁然后变黑。

    您可以使用UIToolbar作为背景。 默认情况下,UIToolbar的高度为50px。 在UIToolbar上添加自动布局约束。 然后选择“高度约束”并对其进行修改

    层次结构如下所示:

    UIView -> clear colour for background.
    - UIToolbar
    - Other contents.
    

    苹果发布了这些效果的类别。这些类别应该手动添加到项目中,并且它支持iOS7。

    在模态启动时,你如何保持back ViewController?在我的例子中,back VC消失了。你不知道,因为back ViewController只是模态ViewController上的一个磨砂图像。正在使用h动画,并由UIToolbar view app store safe支持?如果演示视图控制器是uinavigationcontroller,它是否有效?直接链接到图像效果Category@OneManBand添加了链接。谢谢!这不会像应用商店的模态视图控制器那样动态模糊下面的内容-包括动画特色应用程序。自iOS 8以来,终于有了一种通过
    UIModalPresentationOverCurrentContext
    实现此效果的直接方法。请参见下面的Andrew Plummer、mxcl和Andrey Konstantinov的回答。这不会保持模糊?使用iOS 8方法,背景会在过渡时模糊,并透明地显示第一视图控制器,但是模态视图控制器在完全加载后变为黑色。覆盖似乎将添加到顶视图层上。这不会保持模糊?使用iOS 8方法,背景在过渡时模糊,并透明地显示第一个视图控制器,但模态视图控制器在完全加载后变为黑色。-Crashalotedit@Crashalot您是否更改了任何设置,如将UIModalPresentationOverCurrentContext更改为全屏?要添加@Crashalot,如果您不使用该模式演示样式,则在模式启动后,它将停止“显示”下面的VC,因此它将变为“黑色”(下面没有任何内容)我喜欢你的工作question@Ian-你应该接受Sebastian Hojas的回答什么是主按钮查看控制器?@christijk应该是FancyView控制器(现在是)。谢谢你指出。
    UIView -> clear colour for background.
    - UIToolbar
    - Other contents.