是否可以在不使背景变暗的情况下在 iPad 上呈现模态视图控制器?

Posted

技术标签:

【中文标题】是否可以在不使背景变暗的情况下在 iPad 上呈现模态视图控制器?【英文标题】:Is it possible to present a modal view controller on the iPad without dimming the background? 【发布时间】:2013-06-05 15:21:00 【问题描述】:

我想展示一个不会使后面的内容变暗的模态视图控制器。只需使用标准的 presentViewController。只是将视图控制器的子视图添加到父视图会导致问题。

【问题讨论】:

这似乎是一个可能令人困惑的用户体验,因为通常与模式对话框缺乏一致性。 为什么要这样做?模态视图控制器的目的是接管整个屏幕,让用户在返回应用程序的主要流程之前处理您希望他们做的任何事情。这是通过覆盖整个屏幕或调暗屏幕未覆盖部分(在 iPad 上)来实现的。 这是一种特殊情况,我认为应该例外。 【参考方案1】:

试试这个:

- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];

    // remove the dimming view if needed, when this view controller will appear as modal
    id <UIViewControllerTransitionCoordinator> transitionCoordinator = self.transitionCoordinator;
    if (transitionCoordinator.presentationStyle != UIModalPresentationNone) 
        for (UIView *transitionContainerSubview in transitionCoordinator.containerView.subviews) 
            if ([NSStringFromClass([transitionContainerSubview class]) isEqualToString:@"UIDimmingView"]) 
                transitionContainerSubview.hidden = YES;
            
        
    

【讨论】:

【参考方案2】:

也许看看UIModalPresentationStyle

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) 
UIModalPresentationFullScreen = 0,
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
UIModalPresentationPageSheet,
UIModalPresentationFormSheet,
UIModalPresentationCurrentContext,
#endif
;

您可以在调用 presentViewController:animated:completion: 之前在视图控制器上使用 setModalPresentationStyle: 指定模态演示的类型。

【讨论】:

这如何回答关于不使屏幕其余部分变暗的问题? 我不相信这些风格中的任何一种都能实现我所追求的。 @kyleplattner 从技术上讲,使用“FullScreen”确实是因为整个屏幕都被覆盖了,所以没有任何东西显得暗淡。 :) @rmaddy 您的第二条评论回答了您的第一条评论。将演示文稿样式更改为UIModalPresentationFullScreen 不会使屏幕变暗,这是我(很差)试图用我的答案来表示的;] 如何确保 UIModalPresentationFullScreen 不会让模态视图占据整个屏幕?【参考方案3】:

最好的办法是将视图添加为子视图而不是模态视图控制器。我不知道你的特殊用途,但从它的声音来看,逻辑应该在同一个控制器中。

myControllerThatWasModal.view.layer.opacity = 0.0f;
myControllerThatWasModal.view.hidden = YES;
[self.view addSubview:myControllerThatWasModal.view];
[UIView animateWithDuration:1.0 animations:^
     myControllerThatWasModal.view.layer.opacity = 1.0f;   
];

这是从内存中编写的,因此请原谅任何错误,而且要使其正常工作,您需要在它将覆盖的视图控制器中拥有一个“模态”视图控制器的实例。

【讨论】:

我认为问题在于管理子视图而不是将视图控制器推送到导航控制器上。所以没有办法用presentViewController做到这一点? 没错,管理子视图需要做更多的工作,但它会为您提供所需的功能。没有办法让模态视图控制器做你想做的事;很难有背景。从 UX 的角度来看,背景很有意义,它直观地向用户展示了需要注意的地方,显示在背景中的 viewcontroller 上不会接收到触摸,并且通常看起来不那么杂乱。

以上是关于是否可以在不使背景变暗的情况下在 iPad 上呈现模态视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

在变暗的 UIWindow 上显示 UIView

使 MKMapView 的背景颜色变暗而不使 MKOverlay 变暗

如何在不使用滤镜的情况下使图像变暗? [复制]

页面弹框背景变暗的效果

使 UIView 或 CALayer 变暗的最快方法(性能方面)

如何让 iPhone 屏幕变暗