Entfernen Sie den inneren Schatten, der UIPopoverController erstellt
Ich bin erstellen einer benutzerdefinierten layout der popover, die iOS bietet. Ich habe Unterklassen der UIPopoverBackgroundView und habe es zu zeichnen, den hintergrund für mein popover richtig. Mein problem ist jetzt, dass UIPopoverController schafft einen inneren Schatten auf die popover Auswirkungen auf die contentViewController der popover. Ich möchte zu löschen, diese inneren Schatten, also nur den Inhalt meiner contentViewController angezeigt.
Dies ist, wie die popover derzeit aussieht, mit einem UILabel, um zu zeigen die Wirkung auf die contentViewController.
Gibt es eine Möglichkeit zum entfernen dieser innere Schatten?
- Schauen kajham Antwort, für iOS 6 sollte die akzeptierte Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unterstützung für das neue ios6.0 mit dem folgenden Aufruf:
+ (BOOL)wantsDefaultContentAppearance
Link zur Dokumentation:
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIPopoverBackgroundView_class/Reference/Reference.html
super
im-(void)layoutSubviews
Methode (ich fand es hier: stackoverflow.com/questions/10044227/...)Da es keine elegante Möglichkeit, dies zu tun und da will ich nicht zu schreiben, die gesamte UIPopoverController nur um dies zu tun, habe ich einen einfachen hack, der entfernt die inneren Schatten auf die popover durch das Durchlaufen der UIView-Struktur. Der hack ist eine Kategorie auf UIPopoverController und ich steckte ihn in die Dateien für meine Unterklasse von UIPopoverBackgroundView. So, hier ist der code:
Kann, wenn ich möchte meine popover ich rufen Sie einfach die
presentPopoverWithoutInnerShadowFromRect:
undpresentPopoverWithoutInnerShadowFromBarButtonItem:
Methoden anstelle der standard diejenigen.HINWEIS: denken Sie Daran
#import <QuartzCore/QuartzCore.h>
für den code zu arbeitensubviewA.layer.backgroundColor = [UIColor clearColor].CGColor;
Ich juest meine eigene version für das Projekt an dem ich arbeite.
Grundsätzlich sollten Sie Ihre eigenen benutzerdefinierten
backgroundClass
für popover und in dieser Klasse sollte man definieren:Dürfte so ziemlich bulletproof für iOS-updates.
[self class]
(das ist einobjc_class
) arbeiten?Obwohl ich Stimme im Prinzip, dass die richtige Art und Weise zu handhaben, ist zu roll your own Popover, in diesem Fall ist es ein nicht-Thema für neuere Versionen der OS. Will ich wirklich zum erstellen und pflegen meiner eigenen popover Umsetzung nur um ein OS, das wird irgendwann irrelevant sein? Wenn Sie wirklich wollen, denken Sie an einige Kostenlose open-source-Implementierungen über die web.
Ich persönlich untersucht, die Methoden, die hier vorgeschlagen werden und kam mit meinem eigenen Sie diese Seite als Ausgangspunkt (danke!). Es funktioniert für beide Szenarien (mit oder ohne Navigationsleiste) und ist ein wenig sicherer in meiner Meinung.
Anstelle der Zugabe eine Methode, um die UIPopoverController, ich habe eine routine, um meine UIPopoverBackgroundView zu suchen, die problematische Ansichten über einen RELATIVEN route, nicht als ABSOLUTE. Kurz, da der code hat einen direkten Verweis auf die UIPopoverBackgroundView (selbst), kann es nach oben navigieren (superview) und dann nach unten (Untersichten).
Ansicht Bäume schauen, wie diese in beiden Szenarien:
Mit UINavigationBar:
Ohne UINavigationBar:
Den beiden Ansichten, die wir interessiert sind, ist die UILayoutView und UIImage Ansichten, die sind Fett und Unterstrichen in den einzelnen Graphen. Wir können einen Verweis auf diese ausgehend von der UIPopoverBackgroundView mit dem code unten (es wird angenommen, ARC). Führe ich diese aus
layoutSubviews
in meinem UIPopoverBackgroundView Umsetzung.Benutze ich einen block hier tut für die überquerung der Untersichten zu halten, den code übersichtlich. Es dauert einen Blick als einen Ausgangspunkt und ein array von Klassennamen. Das array von Klassennamen, ist die Reihenfolge der view-Klassen, die ich erwarten, wobei der index 0 ist der übergeordnete index 1 und index 1 ist das übergeordnete Element den index 2 usw. Es gibt die Ansicht vertreten, durch das Letzte Element im array.
NO
auswantsDefaultContentAppearance
.Ich glaube nicht, dass es eine elegant/unterstützte Weg, um zu erreichen, dass mit der Apple-standard UIPopover. Sie können jedoch Ihre eigenen benutzerdefinierten popover-Klasse relativ leicht. Es gibt durchaus ein paar Beispiele, wie Sie tun, so hier auf SO und tutorials auf der breiter web (sogar ein paar ready-to-download-Lösungen). Setzen Sie einfach "benutzerdefinierte uipopover" in Google...
Für FrankZp
Hier ist die änderung für den UINavigationController: