有没有办法在iOS8 上简单地更改UIPopoverView背景颜色(包括它的箭头)?
(我确实阅读了几篇关于自定义"UIPopoverControllers"的文章.这是否也适用于此,意味着答案是"不"?)

这不是我应该能够在prepareForSegue方法中触发弹出窗口的东西吗?我怎样才能达到相应的视图来改变它的外观?
Apple缺少有关如何使用UIPopoverBackgroundViewiOS5中引入的类的文档.有人有例子吗?
我试图将其子类化,但我的Lion上的XCode 4.2缺失了 UIPopoverBackgroundView.h
编辑:不出所料,它应该被导入为#import <UIKit/UIPopoverBackgroundView.h>
我通过继承UIPopoverBackgroundView来制作自定义popover背景.我想制作没有圆角的弹出窗口.我可以成功创建没有圆角的背景(图片中的红色),但似乎UIPopoverController在弹出框的内容中添加了一些圆角掩模(绿色图片).这是我的popover角落的图片:

我有什么想法可以克服它吗?
我在我的应用程序中使用新的(在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];
Run Code Online (Sandbox Code Playgroud)
在我的popovers初始化之后,我正在运行它(仍然在主init代码中),目的是在设置backgroundColor和交互之间进行长时间延迟测试(注意:更改alpha没有任何效果,当设置为1时仍然会发生):
for (UIPopoverController *po in popoverControllers) {
[po setBackgroundColor:[UIColor colorWithWhite:0.3f alpha:0.90f]];
}
Run Code Online (Sandbox Code Playgroud)
然后,当用户点击按钮以显示弹出框时,会调用此方法:
- (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];
}
Run Code Online (Sandbox Code Playgroud)
挺直的.这些是访问此弹出窗口或任何弹出窗口的唯一相关位置,除非在已经显示的情况下将其解除.
我正在实现一个自定义的PopoverBackgroundView,并且在Swift文档中指定我必须实现如下方法:
class SettingsPopoverBackgroundView: UIPopoverBackgroundView {
override var arrowOffset: CGFloat {
get {
return 0.0
}
set {
super.arrowOffset = newValue
}
}
override var arrowDirection: UIPopoverArrowDirection {
get {
return UIPopoverArrowDirection.Up
}
set {
super.arrowDirection = newValue
}
}
func contentViewInsets() -> UIEdgeInsets {
return UIEdgeInsetsMake(10, 10, 10, 10)
}
func arrowBase() -> CGFloat {
return 2.0
}
func arrowHeight() -> CGFloat {
return 2.0
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然收到错误:
UIPopoverBackgroundView contentViewInsets必须由子类实现.
对于这个子类化,似乎Apple有一些乱码异常,这里可以看到,因为我确实实现了contentViewInsets,但仍然得到了错误.
这就是我在prepareForSegue方法中将后台类设置为popover的方法:
popover.popoverBackgroundViewClass = SettingsPopoverBackgroundView.self
Run Code Online (Sandbox Code Playgroud)
这样对吗? …
我通过继承UIPopoverBackgroundView(使用本教程)并使用UIPopoverController呈现它来制作自定义弹出窗口.不幸的是,只要我指定自定义popoverBackgroundViewClass,原生的灰色背景就会消失.使用自定义UIPopoverBackgroundView时,有没有办法让灰色背景变暗?我可以用来模拟本机行为的任何其他解决方案?
我想更改UIPopoverPresentationController用于指向其源的箭头的颜色.我能看到这样做的唯一方法是自己子类化UIPopoverBackgroundView并编写drawRect和绘制popover边框和箭头.这是一种痛苦,因为默认的弹出窗口中有一些细节,比如一切都是圆角.而且我希望尽可能让它在平台上感受到家的感觉.
我是否真的必须绘制自己的弹出箭头才能改变箭头的颜色?
更新:我试过设置backgroundColor的UIPopoverPresentationController,但它似乎改变无处不在的箭头可能绘制颜色.我以前看过它的工作原理,但我无法确定是什么让它起作用.查看将颜色设置为红色的屏幕截图.蓝色是弹出窗口中导航控制器的内容.它应该指向按钮.