2010-03-31 10 views
33

Ich arbeite an einer iPad-Anwendung und verwende UIPopoverControllers. Ich bin an dem Punkt, wo die App gebrandet und gestylt werden muss und ich frage mich, wie ich die Farbe/Tönung des UIPopoverControllers ändern kann? Standard ist dunkelblau aber es muss eine andere Farbe sein ..So passen Sie einen UIPopoverController an

ist das möglich?

Greets, Thomas

+0

Btw, irc.freenode.net #ipaddev ist der Ort zu sein. – Sneakyness

+0

Hey Madhup, du konntest den Pop-over-Controller deiner App anpassen – sandy

Antwort

21

Es ist unmöglich für jetzt.

Es ist, was ich das "Box in a Box" -Modell nenne. Sie erhalten die Kontrolle über die Box innerhalb der Box (die UIViewController innerhalb der UIPopoverController), aber Sie haben sehr begrenzte Kontrolle über das eigentliche Popover selbst. Außerhalb der Pfeilrichtung und der Größe können Sie sonst nicht viel ändern. Es gibt auch Optionen für einen modalen Effekt-Popover, der alles andere dimmt, wenn es auftaucht, aber ich habe nicht versucht, es zum Laufen zu bringen.

Ich bin sicher, Sie haben bemerkt, dass es keine UIPopover Klasse gibt.

Die Antwort, die Sie hören wollen:
Wenn Sie wirklich, um Stil man sich wünschen, dass schlecht, nur Ihre eigenen schreiben. Es ist wirklich nicht so schwer.

Der Link, den Sie klicken mögen:
Cocoacontrols auf GitHub, ein Index für iOS und OSX Komponenten verfügbar ist they have some popover stuff.

+7

Ab iOS5 kannst du nun einfach UIPopoverBackgroundView ableiten und deine Unterklasse in popoverBackgroundViewClass zurückgeben. – steipete

-1

Ich weiß, dass dies eine lausige Antwort konstruiert ist, aber ich habe zu spielen gerade mit die Ansichten des UIPopoverControllers. Sie existieren.

Der einzige Weg, um auf sie zuzugreifen, ist aus Ihrer Sicht, die in der UIPopovercontroller sitzt.

Ich habe einen Navigation-Controller, damit ich diese Hierarchie folgen

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

Dieses Ziel nicht genau das Ende ist, aber es ist ganz in der Nähe.

Sie werden feststellen, dass the_view_in_the_popover.superview.superview (vielleicht nur ein Superview, wenn Sie nicht aus einer Navigation-Controller-Ansicht herausgreifen) ist ein UIPopoverView. Wenn Sie es als UIView darstellen und es als UIView behandeln, verletzen Sie keine Regeln. Ich schätze, das ist wirklich ein Apfel.

+0

das wird nicht so gut funktionieren - es wird nur ein farbiges Quadrat hinter der Popover-Ansicht überlagern. – Pripyat

+2

Sie haben Recht. Ich denke, mein Ziel mit meiner Antwort war, den Leuten zu helfen, in die Hierarchie einzutauchen. Ich habe momentan keine Zeit, um eine vollständige Lösung zu geben. – maxpower

0

ich versuche, es zu betrügen, indem Sie den View-Controller innerhalb des popover Customizing und dann die popover Grenze versteckt mit diesem Code:

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

Die App tatsächlich noch in der Entwicklung ist, damit ich andere Leute Kommentar der Hoffnung, ich werde auf diese Lösung.

+8

Sehr zerbrechlich. Wenn Apple beschließt, etwas in der Hierarchie der Popover-Ansicht zu ändern, wird dieser Code auseinanderfallen. – DarkDust

51

Dies ist möglich in iOS 5.0 Start- von Subklassen der abstrakten Klasse UIPopoverBackgroundView und Zuweisen der Unterklasse auf die popoverBackgroundViewClass Eigentum auf Ihrer UIPopoverController Instanz. Leider gibt es keine tintColor Eigenschaft, da das Popover Bilder für seinen Pfeil und seinen Rand verwenden muss, um glatte Animationen während der dynamischen Größenänderung zu erzielen.Sie können mehr darüber erfahren, wie das Aussehen eines UIPopoverController im UIPopoverBackgroundView Class Reference

-3

entfernen UIPopoverController Grenze anpassen:

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

-1 Niemals die Struktur einer Ansichtshierarchie annehmen. – rbrown

8

Werfen meinen Hut in hier;

Ich habe UIPopoverBackgroundView s in iOS 5+ gehostet, um eine einfache tintColor Eigenschaft auf UIPopoverController s hinzuzufügen.

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

+0

irgendein Beispiel hast du getan? – Hiren

+1

Ich glaube nicht, dass da oben ist, aber es könnte nicht einfacher sein. Verwenden Sie einfach '-initWithContentViewController: andTintColor: 'anstelle von' -initWithContentViewController:'. Der Rest ist der gleiche wie 'UIPopoverController'. –

+0

+1 nette Sachen für Popover-Controller für benutzerdefinierte Farbe. Ziemlich nützlich. –

13

iOS 7 führt backgroundColor Eigenschaft UIPopoverController die Auswirkungen/der Navigationshintergrundfarbe sowie Pfeile von popover enthält.

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

Anwendungsbeispiel:

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

Hinweis - Ab sofort (iOS 7.0.3), in einigen Fällen (wie Set Farbe colorWithPatternImage mit :), dem Simulator (und sogar einige Geräte) respektiert die Farbe nicht.

+0

Und dies beinhaltet die Verwendung des Alpha-Kanals, um transparente oder teilweise transparente Popovers zu haben, z.B. popoverController.backgroundColor = UIColor (weiß: 1, alpha: 0.5) –

+0

Vergessen Sie nicht, die Farbe/Alpha der Ansicht in Ihrem Popover und den Steuerelementen innerhalb dieser Ansicht zu ändern. –