如何自定义/样式化 UIPopoverController

Posted

技术标签:

【中文标题】如何自定义/样式化 UIPopoverController【英文标题】:How to customize / style a UIPopoverController 【发布时间】:2011-02-02 21:45:06 【问题描述】:

我正在开发一个 iPad 应用程序,并且正在使用 UIPopoverControllers。我处于应用程序需要品牌和样式的部分,我想知道如何更改 UIPopoverController 的颜色/色调?标准是深蓝色,但它需要是另一种颜色..

这可能吗?

你好,托马斯

【问题讨论】:

顺便说一句,irc.freenode.net #ipaddev 是个好去处。 Hey Madhup,您能否自定义应用的弹出式控制器 【参考方案1】:

可能iOS 5.0 开始,通过继承抽象类 UIPopoverBackgroundView 并将您的子类分配给您的 UIPopoverController 实例上的 popoverBackgroundViewClass 属性。不幸的是,没有tintColor 属性,因为弹出框需要为其箭头和边框使用图像,以便在动态调整大小期间实现平滑的动画。您可以在UIPopoverBackgroundView Class Reference中了解更多关于如何自定义 UIPopoverController 外观的信息

【讨论】:

【参考方案2】:

暂时不可能。

这就是我所说的“盒子中的盒子”模型。您可以控制框内的框(UIPopoverController 内的 UIViewController),但您对实际弹出框本身的控制非常有限。在箭头方向和大小之外,你不能改变太多。还有模态效果弹出框的选项,当它出现时它会使其他所有内容变暗,但我没有尝试让它工作。

我确定您已经注意到现在没有 UIPopover 类。

您想听到的答案: 如果你真的想设计那么糟糕的风格,那就写你自己的吧。这真的没那么难。

您要点击的链接:Cocoacontrols 是 GitHub 上可用的 ios 和 OSX 组件的索引,they have some popover stuff.

【讨论】:

从 iOS5 开始,您现在可以只继承 UIPopoverBackgroundView 并将您的子类返回到 popoverBackgroundViewClass。【参考方案3】:

iOS 7 引入了UIPopoverControllerbackgroundColor 属性,该属性影响/包括导航背景颜色以及弹出框的箭头。

@property (nonatomic, copy) UIColor *backgroundColor NS_AVAILABLE_IOS(7_0);

用法示例:

    if ([self.popoverVC respondsToSelector:@selector(setBackgroundColor:)])    // Check to avoid app crash prior to iOS 7
        self.popoverVC.backgroundColor = [UIColor greenColor];   // [UIColor colorWithPatternImage:@"..."] doesn't reflect the color on simulator but on device it works!
    

注意 - 截至目前 (iOS 7.0.3),在某些情况下(例如使用 colorWithPatternImage 设置颜色:),模拟器(甚至某些设备)不支持颜色。

【讨论】:

这包括使用 Alpha 通道来获得透明或部分透明的弹出框,例如popoverController.backgroundColor = UIColor(white: 1, alpha: 0.5) 不要忘记在弹出窗口中更改视图的颜色/alpha,并酌情更改该视图中的控件。【参考方案4】:

把我的帽子扔在这里;

我在 iOS 5+ 中利用UIPopoverBackgroundViews 将一个简单的tintColor 属性添加到UIPopoverControllers 上。

PCPopoverController:https://github.com/pcperini/PCPopoverController

【讨论】:

我不相信有任何进展,但这再简单不过了。只需使用-initWithContentViewController:andTintColor: 而不是-initWithContentViewController:。其余同UIPopoverController +1 用于自定义颜色的弹出框控制器的好东西。很有用。【参考方案5】:

我尝试通过在弹出框内自定义视图控制器然后使用以下代码隐藏弹出框边框来欺骗它:

UIView * border = [[insideViewController.view.superview.superview.superview subviews] objectAtIndex:0];  
border.hidden = YES;

该应用程序实际上仍在开发中,所以我希望其他人会对此解决方案发表评论。

【讨论】:

非常脆弱。如果 Apple 决定更改弹出视图层次结构中的某些内容,则此代码将崩溃。【参考方案6】:

查看这些利用 UIPopoverBackgroundView 的最新项目 https://github.com/CRedit360/C360PopoverBackgroundView https://github.com/GiK/GIKPopoverBackgroundView

【讨论】:

【参考方案7】:

从 ios 5 开始就可以了,这里有一个库

https://github.com/ddebin/DDPopoverBackgroundView

看文档,很简单

祝你好运

【讨论】:

【参考方案8】:

您可以为此使用Elegant Popover cocoapod。您可以自定义箭头和弹出框本身的形状和颜色。此外,您可以为弹出框添加彩色边框。

【讨论】:

【参考方案9】:

我知道这是一个糟糕的构造答案,但我只是在玩 UIPopoverController 的视图。它们确实存在。

访问它们的唯一方法是从您位于 UIPopovercontroller 中的视图。

我有一个导航控制器,所以我遵循这个层次结构

UIView *test = ((UIView *)[[[self.navigationController.view.superview.superview.subviews objectAtIndex:0] subviews] objectAtIndex:1]);
UIView *test2 = ((UIView *)[[[self.navigationController.view.superview.superview.subviews objectAtIndex:0] subviews] objectAtIndex:1]);
test.backgroundColor = [UIColor greenColor];
test2.backgroundColor = [UIColor greenColor];

这并不是最终目标,但确实很接近。

您会发现the_view_in_the_popover.superview.superview(如果您没有从导航控制器视图中伸出,可能只是一个超级视图)是一个 UIPopoverView。如果您将其转换为 UIView 并将其视为 UIView 您并没有真正违反任何规则。我想这真的取决于苹果。

【讨论】:

这不会很好 - 它只会在弹出视图后面覆盖一个彩色方块。 你是对的。我认为我回答的目标只是帮助人们深入了解层次结构,我现在真的没有时间给出完整的解决方案。【参考方案10】:

移除 UIPopoverController 边框:

 NSArray* subviews = ((UIView*)[popupController.contentViewController.view.superview.superview.superview.subviews objectAtIndex:0]).subviews;
for(UIView *subview in subviews)
    [subview removeFromSuperview];

【讨论】:

以上是关于如何自定义/样式化 UIPopoverController的主要内容,如果未能解决你的问题,请参考以下文章

使用样式化组件自定义 antd 工具提示样式

如何将自定义样式添加到样式组件?

将自定义类/样式传递给 Gatsby (React) 中的样式化组件

ReactJS 中的样式化组件自定义 CSS

使用状态自定义样式的反应+样式化组件

Confluence 6 中样式化字体