UIPopoverController backgroundColor 在显示时导致闪烁

Posted

技术标签:

【中文标题】UIPopoverController backgroundColor 在显示时导致闪烁【英文标题】:UIPopoverController backgroundColor causing flash when shown 【发布时间】:2013-09-22 17:46:46 【问题描述】:

我在我的应用程序中使用新的(在 ios 7 中)UIPopoverController.backgroundColor 设置来根据需要更改弹出框的颜色,但我发现使用此设置会导致颜色变化的“闪烁”我打开我的弹出框——大约半秒钟后,它从默认的半透明白色开始,逐渐变成我选择的颜色。这是不希望的;它应该只是我打开它时设置的颜色。

文档说明:

使用此属性自定义弹出框的背景颜色。在弹出框可见时更改此属性的值会触发到新颜色的动画转换。该属性默认值为nil,对应默认背景色。

但是,即使我在我的应用打开时设置了它并且不再设置它,它仍然会在我每次打开任何弹出窗口时闪烁。

我对使用 UIPopoverBackgroundView 持开放态度,但我不确定它是否允许我即时更改背景颜色,因为它似乎是一个静态解决方案,仅用于更改应用程序中所有弹出框的样式.提前感谢您的任何建议。

编辑(代码):

当我的主视图控制器被加载并准备 UI 的其余部分时(这是许多弹出框初始化之一):

fileOptionsController = [[FileOptionsViewController alloc] initWithNibName:@"FileOptionsViewController" bundle:nil];
fileOptionsController.delegate = self;

self.fileOptionsPopoverController = [[UIPopoverController alloc] initWithContentViewController:fileOptionsController];
[popoverControllers addObject:self.fileOptionsPopoverController];

在我的弹出框初始化后,我正在运行它(仍在主初始化代码中),以便在设置 backgroundColor 和交互之间有很长的延迟进行测试(注意:更改 alpha 没有效果,仍然会发生在设置为 1):

for (UIPopoverController *po in popoverControllers) 
    [po setBackgroundColor:[UIColor colorWithWhite:0.3f alpha:0.90f]];

然后,当用户点击按钮以显示弹出框时调用它:

- (void)showPopover:(UIPopoverController *)popover from:(UIButton *)btn 
    [popover presentPopoverFromRect:CGRectMake(btn.frame.origin.x + 5.0f, btn.frame.origin.y - 1.0f, btn.frame.size.width, btn.frame.size.height) inView:btn.superview permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

非常直接。这些是唯一可以访问此弹出框或任何弹出框的相关位置,除非它已经显示在何处将其关闭。

【问题讨论】:

我最初的问题仍然存在,但我正在通过创建一个简洁的 UIPopoverBackgroundView 然后设置 UIPopoverController.contentViewController 的背景颜色来解决它。 【参考方案1】:

我解决了这个问题,在更改背景颜色之前关闭弹出框,然后再次呈现:

[popover dismissPopoverAnimated:NO];

if ([popover respondsToSelector:@selector(backgroundColor)]) 
    popover.backgroundColor = [UIColor someColor];         


[popover setContentViewController:viewController animated:NO];
[popover setPopoverContentSize:CGSizeMake(320.0f, 480.0f) animated:NO];

[popover presentPopoverFromRect:popoverRect
                         inView:self.view
       permittedArrowDirections:UIPopoverArrowDirectionRight
                       animated:NO];

这样做会再次显示弹出框,您不会看到任何不需要的过渡效果。

【讨论】:

【参考方案2】:

由于文档说backgroundColor 会为其设置颜色动画,因此这似乎是导致此闪光/动画的原因(Apple 应该给 setBackgroundColor 带/不带动画)。

如果您有能力在没有动画的情况下呈现弹出框,我建议您可以在呈现时尝试关闭动画。就像这两个之一 -

选项 1 -

// last parameter as 'NO'
[popover presentPopoverFromRect:CGRectMake(btn.frame.origin.x + 5.0f, btn.frame.origin.y - 1.0f, btn.frame.size.width, btn.frame.size.height) inView:btn.superview permittedArrowDirections:UIPopoverArrowDirectionLeft animated:NO]; // Don't animate to present

选项2 - (使用UIViewsetAnimationsEnabled方法暂时关闭动画)

- (void)showPopover:(UIPopoverController *)popover from:(UIButton *)btn 
    [UIView setAnimationsEnabled:NO];   // Turn off animation

    [popover presentPopoverFromRect:CGRectMake(btn.frame.origin.x + 5.0f, btn.frame.origin.y - 1.0f, btn.frame.size.width, btn.frame.size.height) inView:btn.superview permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

    [UIView setAnimationsEnabled:YES];   // Turn back on

从逻辑上讲,这应该可以工作,除非 Apple 在其 sdk 中进一步破解此属性。

【讨论】:

【参考方案3】:

如果您添加代码会更好...如果没有代码,我只能说如果您在视图出现后设置颜色,那么它将动画到该颜色。所以先改变背景颜色,然后让弹出框可见。

【讨论】:

以上是关于UIPopoverController backgroundColor 在显示时导致闪烁的主要内容,如果未能解决你的问题,请参考以下文章

定制的 UIPopoverController?

当 UIPopoverController 在屏幕上时,无法与带有 UIPopoverController 的 UISearchBar 进行交互

UIPopoverController 没有箭头?

UIPopoverController:关闭后更新视图

自动旋转时出现 UIPopOverController 问题

UIPopoverController 内容视图大小