【问题标题】:Presenting transparent view controller over another在另一个上呈现透明视图控制器
【发布时间】:2016-01-21 17:55:00
【问题描述】:

我试图在另一个视图控制器上显示一个视图控制器,其中上部是透明的,底部会产生这种模糊效果。

发生的事情是我在呈现的视图中看到黑色背景,尽管它的颜色很清晰。

我也读过这里,并且完全一样: Display clearColor UIViewController over UIViewController

//to present     
PillView *pillv=[[PillView alloc]initWithPill:pill WithNum:num];
     pillv.delegate=self;


    UIVisualEffect *blurEffect;
    blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

    UIVisualEffectView *visualEffectView;
    visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    visualEffectView.frame=CGRectMake(0, 0, self.view.frame.size.width, [Globals sharedGlobals].titleHeight*self.view.frame.size.height);
    [self.view addSubview:visualEffectView];



    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:pillv animated:NO completion:nil];

【问题讨论】:

  • 你是用模拟器还是设备测试?
  • 模拟器,有问题吗?
  • 也检查了设备不工作..
  • 所以你想让 pillView 透明?
  • 是的。它实际上是透明的,我将它的背景设置为清除

标签: ios objective-c


【解决方案1】:

您需要将UIVisualEffectView 添加到呈现的视图控制器,而不是正在执行演示的视图控制器。

PillView *pillv=[[PillView alloc]initWithPill:pill WithNum:num];
     pillv.delegate=self;


UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
visualEffectView.frame= pillv.view.bounds;
pillv.view.backgroundColor = [UIColor clearColor];
[pillv.view insertSubview:visualEffectView atIndex:0];

self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:pillv animated:NO completion:nil];

因为 OP 似乎认为我的解决方案不起作用,这里有一个示例项目来展示这一点:

https://dl.dropboxusercontent.com/u/29456419/blurTest.zip

这是视图(呈现)的图片,然后是 OverlayView:

【讨论】:

  • 我认为这不是我想要的。我希望底部视图控制器模糊,它上面有药丸。
  • 这不是对呈现的视图产生模糊效果吗?我认为OP要求透明视图!!!
  • 还是没有解决透明视图控制器的问题。因为无论如何我都不会在你的方法中看到底部视图。
  • 当您在明确的 UIViewController 上添加 UIVisualEffectView 时,父(呈现)viewController 视图显示为模糊。这就是他想要的
  • @Curnelious 你试过我给你看的吗?因为我在我的应用程序上使用它并且它有效。唯一的区别是我在该视图控制器的 viewDidLoad 委托上设置呈现的视图控制器属性,但我认为这没有什么不同
【解决方案2】:

如果在 iOS8 或更高版本上,则使用 UIModalPresentationOverCurrentContext 作为演示样式。

但是,关键设置是您需要将 definesPresentationContext 设置为 true 才能让您希望看到显示的控制器。

来自文档:

UIModalPresentationOverCurrentContext

内容显示在视图上的一种演示样式 控制器的内容,其 definePresentationContext 属性为 YES。 UIKit 可能会沿着视图控制器层次结构查找视图 想要定义表示上下文的控制器。观点 呈现的内容下方不会从视图层次结构中删除 当演示结束时。所以如果呈现的视图控制器 不使用不透明内容填充屏幕,底层内容 显示通过。

在弹出窗口中显示视图控制器时,此显示 仅当过渡样式为 UIModalTransitionStyleCoverVertical。尝试使用不同的 过渡风格触发异常。但是,您可以使用其他 过渡样式(部分卷曲过渡除外)如果父 视图控制器不在弹出窗口中。

适用于 iOS 8.0 及更高版本。

所以:

self.definesPresentationContext = true
self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:pillv animated:NO completion:nil];

【讨论】:

  • 可能是pillv.modalPresentationStyle = UIModalPresentationOverCurrentContext;?
  • @Cy-4AH 我认为它必须在定义模态表示的上下文的控制器上设置,因此self
【解决方案3】:

从 iOS 8 及更高版本请使用 UIModalPresentationOverCurrentContext 而不是 UIModalPresentationCurrentContext

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2016-11-20
    • 2014-12-12
    • 1970-01-01
    • 2014-12-12
    • 2015-02-24
    • 2015-04-06
    相关资源
    最近更新 更多