UIPopoverController背景色显示时会导致闪烁
我在应用程序中使用新的(在iOS 7中)UIPopoverController.backgroundColor设置来根据需要更改我的PopOver的颜色,但我发现使用此设置会在每次打开我的PopOver时引起颜色更改的“闪烁”——大约在半秒钟内,它从默认的半透明白色开始,并褪色为我选择的颜色。这是不可取的;它应该是我打开它时设置的颜色 文件规定: 使用此属性可自定义popover的背景色。在popover可见时更改此属性的值将触发动画转换为新颜色。此属性的默认值为nil,对应于默认背景色 然而,即使我在应用程序打开时设置了它,并且不再设置,每次打开任何一个弹出窗口时,它仍然会闪烁 我对使用UIPopoOverBackgroundView持开放态度,但我不确定它是否允许我动态更改背景颜色,因为它似乎是一种静态解决方案,仅用于更改应用程序中所有Popover的样式。提前感谢您的建议 编辑(代码): 加载我的主视图控制器并准备UI的其余部分时(这是许多popover初始化之一): 在我的弹出框初始化之后,我运行这个(仍然在主初始化代码中)是为了在设置backgroundColor和交互之间有很长的延迟进行测试(注意:更改alpha没有效果,当设置为1时仍然会发生): 然后,当用户点击按钮以显示popover时调用:UIPopoverController背景色显示时会导致闪烁,uipopovercontroller,ios7,uipopoverbackgroundview,Uipopovercontroller,Ios7,Uipopoverbackgroundview,我在应用程序中使用新的(在iOS 7中)UIPopoverController.backgroundColor设置来根据需要更改我的PopOver的颜色,但我发现使用此设置会在每次打开我的PopOver时引起颜色更改的“闪烁”——大约在半秒钟内,它从默认的半透明白色开始,并褪色为我选择的颜色。这是不可取的;它应该是我打开它时设置的颜色 文件规定: 使用此属性可自定义popover的背景色。在popover可见时更改此属性的值将触发动画转换为新颜色。此属性的默认值为nil,对应于默认背景色 然而,
- (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];