UIPopoverController backgroundColor在显示时导致flash

时间:2013-09-22 17:46:46

标签: uipopovercontroller ios7 uipopoverbackgroundview

我在我的应用程序中使用新的(在iOS 7中)UIPopoverController.backgroundColor设置来根据需要更改我的弹出窗口的颜色,但我发现使用此设置会导致颜色更改的“闪光”我打开我的弹出窗口 - 大约半秒钟它从默认的半透明白色开始,淡化为我选择的颜色。这是不希望的;它应该是我打开它时设置的颜色。

文档说明:

  

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

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

我愿意使用UIPopoverBackgroundView,但我不确定它是否允许我即时更改背景颜色,因为它似乎是一个静态解决方案,只需更改应用程序中所有弹出窗口的样式。提前感谢任何建议。

编辑(守则):

当我的主视图控制器被加载并准备其余UI时(这是许多popover inits中的一个):

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

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

在我的popovers初始化之后,我正在运行它(仍在主init代码中),目的是在设置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];
}

非常直接。这些是访问此弹出窗口或任何弹出窗口的唯一相关位置,除非在已经显示的情况下将其解除。

3 个答案:

答案 0 :(得分:2)

我解决了这个问题,在更改backgroundColor然后再次显示之前解除了popover:

[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];

这样再次显示弹出窗口,您将看不到任何不需要的过渡效果。

答案 1 :(得分:1)

由于文档说backgroundColor会为你的颜色设置动画,所以这似乎会导致这个flash /动画(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 - (使用setAnimationsEnabled的{​​{1}}方法暂时关闭动画)

UIView

从逻辑上讲,这应该可行,除非Apple在其sdk中进一步攻击此属性。

答案 2 :(得分:0)

如果你添加你的代码会更好...没有代码我可以说如果你在视图出现后设置颜色,那么它将动画为该颜色。因此,首先更改背景颜色,然后使popover可见。