加载黑色背景的模态视图控制器

Posted

技术标签:

【中文标题】加载黑色背景的模态视图控制器【英文标题】:Modal View Controller loading with black background 【发布时间】:2013-03-17 22:17:34 【问题描述】:

我通过搜索看到了其中一些问题,但主要与故事板有关。

我只是务实地创建一个模态视图控制器。它实际上是用于可达性的,一旦连接被视为 NotReachable,我会呈现一个模态视图控制器,如下所示:

-(void)checkConnection: (Reachability*) curReach 
    NetworkStatus netStatus = [curReach currentReachabilityStatus];
        if (netStatus == NotReachable) 
            NSLog(@"inernet reach - not reachable");

            UIViewController *modalViewController = [[MESConnectionModalViewController alloc] init];
            modalViewController.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2f];
            modalViewController.view.opaque= YES;
            [self.window.rootViewController presentModalViewController:modalViewController animated:YES];



在视图控制器MESConnectionModalViewController 中目前没有代码,只有标准。

当模态视图转换到当前视图时,背景看起来是正确的(这是一两秒钟的时间)。一旦模态完全在屏幕上,它就是全黑的,而不是部分黑的。我希望基本上稍微涵盖当前内容。上面的代码是应用程序委托中的 seutp 并在可达性更新时调用,所以我试图在解决互联网连接时显示一个模式视图控制器。

【问题讨论】:

是否试图将模态视图设置为小于视图本身?如果是这样,为什么不使用 cg rect 并为其设置坐标,以便在呈现时它会比视图小。 【参考方案1】:

模态视图不支持透明度(适用于 iPhone)。 但是您可以将“UIView”添加到父视图并使用CoreAnimation对其进行动画处理

编辑

-(void)checkConnection: (Reachability*) curReach 
    NetworkStatus netStatus = [curReach currentReachabilityStatus];
    if (netStatus == NotReachable) 
        NSLog(@"internet reach - not reachable");
        UIViewController *modalViewController = [[MESConnectionModalViewController alloc] init];
        //Set y position to animate it
        CGRect frame = modalViewController.view.frame;
        frame.origin.y = [[UIApplication sharedApplication] keyWindow].frame.size.height;
        modalViewController.view.frame = frame;
        modalViewController.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2f];
        [self.view addSubview:modalViewController.view];
        //Animate appearing
        frame.origin.y = 0;
        [UIView animateWithDuration:0.2 animations:^
            modalViewController.view.frame = frame;
        ];
    

您还可以将modalViewController 存储为属性,以便将来访问它。

【讨论】:

你能解释一下如何做到这一点吗?作为更多背景知识,它在整个应用程序的任何地方用作向用户发送的消息,因此当与 Internet 的连接丢失时,在应用程序委托中进行设置。 感谢编辑,我收到两个错误。 [self.view 行...在应用程序委托上找不到属性视图。这是因为我无法向应用程序委托添加视图,我需要将其添加到呈现的视图控制器(以当前显示的为准),但我不确定如何执行此操作?其次,frame.y 行的错误...没有名为 y 的成员在 struct CGRect 上? 编辑了第二期。您可以尝试将子视图添加到UIWindow。 [[[UIApplication sharedApplication] keyWindow] addSubview:modalViewController.view]; 谢谢,这可行,但我有一个问题,如果应用程序(从新)启动并且没有可用的互联网连接,它不会显示。我认为问题在于上面的视图是在加载实际主视图之前显示的。无论如何我可以解决这个问题,你会说这应该是一个新问题吗? 另外,我如何检查这个视图是否正在呈现,如果连接恢复则删除这个子视图?【参考方案2】:

你需要的是第二个UIWindow AppDelegate 类 你可以在一切之上制作类似 UIAlertView 的东西! 相信我,这就是你所需要的,并确保设置

myWindow2.windowLevel = UIWindowLevelAlert;

访问您的窗口(获取指针):

UIWindow *myWindow2 = [(AppDelegate *)[UIApplication sharedApplication].delegate myWindow2];

【讨论】:

您能提供更多关于需要完成什么的信息吗?我应该继承 UIAlertView 并更改 viewDidLoad 以包含视图的配色方案吗?那么这是如何呈现的呢? 对于警报,您的选项是 ios 默认警报(UIAlertView 或 UIActionSheet)或创建您自己的:1-向 AppDelegate 添加一个窗口并将其级别设置为警报级别。 2-添加您的自定义警报,这是一个 UIView 基类,具有标题标签、文本标签和一些按钮,然后使用 window.hidden = [YES/NO] 来显示您的警报!

以上是关于加载黑色背景的模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nativescript 中显示模态视图时将窗口背景变为黑色

模态转场导致黑屏

iOS 7 模态视图转换和背景/壁纸

iOS模拟器视图控制器黑色背景Xcode 6.4

PickerView 在黑色背景下不可见

iOS - 半透明模态视图控制器