在呈现 UIPopoverViewController 时,如何使除 sourceView 之外的所有内容变暗?

Posted

技术标签:

【中文标题】在呈现 UIPopoverViewController 时,如何使除 sourceView 之外的所有内容变暗?【英文标题】:How can I get to dim everything except for the sourceView when presenting UIPopoverViewController? 【发布时间】:2019-08-29 08:56:58 【问题描述】:

我正在开发一个类似于 WhatsApp 的聊天应用程序。当用户长按消息时,会显示带有选项的弹出框。除了弹出框和弹出框的 sourceView 之外,我想调暗背景中的所有内容。像这样:

我试过了,但是所有的背景都变暗了:

- (void)prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController 
    [[popoverPresentationController containerView] setBackgroundColor:[UIColor colorWithWhite:0 alpha:.72]];


【问题讨论】:

【参考方案1】:

Javad

您可以在演示视图中全屏添加空白。设置黑色背景颜色和 alpha 0.5 会产生暗淡的效果。

谢谢

【讨论】:

不会让所有东西都变暗,包括 sourceView 吗? 是的,因为空白视图独立于源视图 好的,但是我想保持源视图不变,即不变暗,只有它的周围,请看图片。 我相信我需要将源视图添加到背景视图中:/【参考方案2】:

我设法通过重新创建一个单元格并将其添加到弹出容器视图中来做到这一点:

- (void)prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController 
    [[popoverPresentationController containerView] setBackgroundColor:[UIColor colorWithWhite:0 alpha:.72]];

    MessageCellNode *messageNode = [[MessageCellNode alloc] init];

    UICollectionViewLayoutAttributes *attributes = [[self.collectionNode view] layoutAttributesForItemAtIndexPath:indexPathToSelect];
    CGRect cellRect = attributes.frame;

    CGRect rect = [[[self collectionNode] view] convertRect:cellRect toView:[[UIApplication sharedApplication] keyWindow]];

    [messageNode setFrame: rect];

    [[popoverPresentationController containerView]addSubview:[messageNode view]];

结果:

【讨论】:

以上是关于在呈现 UIPopoverViewController 时,如何使除 sourceView 之外的所有内容变暗?的主要内容,如果未能解决你的问题,请参考以下文章

在 iPad 上将 UIView 作为矢量呈现为 PDF - 有时呈现为位图,有时呈现为矢量

检查后仍然出现“尝试在已经呈现时呈现”?

如何在模态呈现的视图控制器上执行呈现模态序列?

在动画呈现控制器视图的同时动画呈现控制器视图

从 AppDelegate 到 PresentedViewController 的警报:“尝试在...上呈现 UIAlertController 已经在呈现 UIAlertController”

警告:尝试在已经呈现的 MainTableViewController 上呈现 ModalTableViewController (null)