How to customize / style a UIPopoverController

给你一囗甜甜゛ 提交于 2019-11-26 09:07:45

问题


I\'m working on an iPad application and I\'m using UIPopoverControllers. I\'m at the part where the app needs to be branded and styled and i\'m wondering how to change the color / tint of the UIPopoverController? Standard is dark blue but it needs to be another color..

is this possible?

Greets, Thomas


回答1:


This is possible starting in iOS 5.0 by subclassing the abstract class UIPopoverBackgroundView and assigning your subclass to the popoverBackgroundViewClass property on your UIPopoverController instance. Unfortunately there is no tintColor property as the popover needs to use images for it's arrow and border in order to achieve smooth animations during dynamic resizing. You can learn more about how to customize the appearance of a UIPopoverController in the UIPopoverBackgroundView Class Reference




回答2:


It's impossible for now.

It's what I call the "Box in a Box" model. You get control of the box inside of the box (the UIViewController inside of the UIPopoverController), but you have very limited control over the actual popover itself. Outside of the arrow direction and the size, you can't change much else. There are also options for a modal effect popover, which dims everything else when it shows up, but I haven't tried to get it working.

I'm sure you've noticed there is no UIPopover class by now.

The answer you want to hear:
If you really want to style one that bad, just write your own. It's really not that hard.

The link you want to click:
Cocoacontrols is an index of iOS and OSX components available on GitHub, they have some popover stuff.




回答3:


iOS 7 introduces backgroundColor property of UIPopoverController which affects/includes the navigation background color as well as arrows of popover.

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

Usage example:

    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!
    }

Note - As of now (iOS 7.0.3), in some cases (like set color using colorWithPatternImage:), the simulator (and even some devices) doesn't honor the color.




回答4:


Throwing my hat in here;

I've leveraged UIPopoverBackgroundViews in iOS 5+ to add a simple tintColor property onto UIPopoverControllers.

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




回答5:


I try to trick it by customizing the view controller inside the popover and then hiding the popover border using this code:

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

The app is actually still in development so I'm hoping other people will comment on this solution.




回答6:


check out these latest projects leveraging UIPopoverBackgroundView https://github.com/CRedit360/C360PopoverBackgroundView https://github.com/GiK/GIKPopoverBackgroundView




回答7:


from ios 5 onward it is can be done, here is a library

https://github.com/ddebin/DDPopoverBackgroundView

just look at the documentation , and it is quite easy

good luck




回答8:


I know this is a lousy constructed answer, but I've just been playing with the UIPopoverController's views. They do exist.

The only way to access them is from your view that is sitting in the UIPopovercontroller.

I have a navigation controller so I follow this hierarchy

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

This isn't exactly the end goal, but it is really close.

you'll find that the_view_in_the_popover.superview.superview (maybe just one superview if you are not reaching out from a navigation controller view) is a UIPopoverView. If you cast it as a UIView and treat it as a UIView you're not really breaking any rules. I guess that is really up to apple though.




回答9:


Remove UIPopoverController border:

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


来源:https://stackoverflow.com/questions/2552686/how-to-customize-style-a-uipopovercontroller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!