UIPopoverController背景色显示时会导致闪烁

UIPopoverController背景色显示时会导致闪烁,uipopovercontroller,ios7,uipopoverbackgroundview,Uipopovercontroller,Ios7,Uipopoverbackgroundview,我在应用程序中使用新的(在iOS 7中)UIPopoverController.backgroundColor设置来根据需要更改我的PopOver的颜色,但我发现使用此设置会在每次打开我的PopOver时引起颜色更改的“闪烁”——大约在半秒钟内,它从默认的半透明白色开始,并褪色为我选择的颜色。这是不可取的;它应该是我打开它时设置的颜色 文件规定: 使用此属性可自定义popover的背景色。在popover可见时更改此属性的值将触发动画转换为新颜色。此属性的默认值为nil,对应于默认背景色 然而,

我在应用程序中使用新的(在iOS 7中)UIPopoverController.backgroundColor设置来根据需要更改我的PopOver的颜色,但我发现使用此设置会在每次打开我的PopOver时引起颜色更改的“闪烁”——大约在半秒钟内,它从默认的半透明白色开始,并褪色为我选择的颜色。这是不可取的;它应该是我打开它时设置的颜色

文件规定:

使用此属性可自定义popover的背景色。在popover可见时更改此属性的值将触发动画转换为新颜色。此属性的默认值为nil,对应于默认背景色

然而,即使我在应用程序打开时设置了它,并且不再设置,每次打开任何一个弹出窗口时,它仍然会闪烁

我对使用UIPopoOverBackgroundView持开放态度,但我不确定它是否允许我动态更改背景颜色,因为它似乎是一种静态解决方案,仅用于更改应用程序中所有Popover的样式。提前感谢您的建议

编辑(代码):

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

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

然后,当用户点击按钮以显示popover时调用:

- (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];
}

非常直截了当。这些是访问此popover或任何popover的唯一相关位置,但如果它已经显示,则在何处关闭它。

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

因为文档中说,
背景色将为其设置动画颜色,所以这似乎是导致此闪烁/动画的原因(苹果应该为setBackgroundColor提供动画/不带动画)

如果您可以在不使用动画的情况下演示popover,我建议您可以尝试在演示时关闭动画。就像这两个中的一个-

选项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-(使用
ui视图的
setanimationEnabled
方法临时关闭动画)


从逻辑上讲,除非苹果在其sdk中进一步攻击此属性,否则这应该是可行的。

我解决了这个问题,在更改背景颜色之前,先将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];

这样,popover会再次显示,您不会看到任何不必要的过渡效果。

我原来的问题仍然存在,但我正在通过创建一个无装饰的UIPopoOverBackgroundView,然后设置UIPopoOvercontroller.contentViewController的背景色来解决这个问题。
// 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
- (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
}
[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];