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 - (使用UIView
的setAnimationsEnabled
方法暂时关闭动画)
- (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 的 UISearchBar 进行交互