2012-04-06 10 views
14

Ich habe diese gute tutorial verwendet, um eine benutzerdefinierte UIPopoverBackgroundView-Klasse zu erstellen.Benutzerdefinierte UIPopoverBackgroundView: kein Schlagschatten

Es funktioniert gut. Das einzige Problem ist, dass ich nicht den typischen UIPopoverController Schlagschatten bekomme und ich will es. Ich habe versucht, es auf der Ebene meiner UIPopoverBackgroundView-Instanz ohne Erfolg zu spezifizieren. Meine Instanz von UIPopoverController scheint keine öffentliche Ansicht zu haben, die manipuliert werden kann. Das Hinzufügen zum Popover-Inhalt funktioniert auch nicht.

Wahrscheinlich wirklich einfach: Wie füge ich einen Schlagschatten hinzu, wenn ich eine benutzerdefinierte UIPopoverBackgroundView-Klasse verwende?

// UIPopoverBackgroundView.m

-(id)initWithFrame:(CGRect)frame{ 
    if (self = [super initWithFrame:frame]) { 
     _borderImageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"bg-popover.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(CAP_INSET,CAP_INSET,CAP_INSET,CAP_INSET)]]; 

     _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg-popover-arrow.png"]]; 

     [self addSubview:_borderImageView]; 
     [self addSubview:_arrowView]; 

     self.layer.shadowOffset = CGSizeMake(50, 50); 
     self.layer.shadowColor = [[UIColor blackColor] CGColor]; 
    } 

    return self; 
} 

Antwort

14

Ok, es herausgefunden. Ich musste den Schlagschatten zu der borderImageView hinzufügen, nicht die Ansicht der Popover-Instanz.

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
     _borderImageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"bg-popover.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(CAP_INSET,CAP_INSET,CAP_INSET,CAP_INSET)]]; 

     _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg-popover-arrow.png"]]; 

     [self addSubview:_borderImageView]; 
     [self addSubview:_arrowView]; 

     _borderImageView.layer.cornerRadius = 5.0f; 
     _borderImageView.layer.masksToBounds = NO; 
     _borderImageView.layer.borderWidth = 1.0f; 
     _borderImageView.layer.borderColor = [UIColor blackColor].CGColor; 

     _borderImageView.layer.shadowColor = [UIColor blackColor].CGColor; 
     _borderImageView.layer.shadowOpacity = 0.8; 
     _borderImageView.layer.shadowRadius = 50; 
     _borderImageView.layer.shadowOffset = CGSizeMake(-10.0f, 10.0f); 
    } 

    return self; 
} 
+0

Vielen Dank an apps! –

+1

Ich dachte nur, dass das für mich funktioniert, aber ich hatte Leistungsprobleme. Die Rasterung der Hintergrundebene hat enorm geholfen: 'backgroundImageView.layer.shouldRasterize = YES;' – Maurizio

+0

Interessant - Ich habe keine signifikante Verzögerung bemerkt (auf iPad 2), aber gut zu wissen. –

19

Sie müssen keine eigenen Schatten hinzufügen. Die Basis UIPopoverBackgroundView wird es für Sie tun. Stellen Sie sicher, dass Sie Super in Ihrer layoutSubviews Implementierung aufrufen.

EDIT: Mein Kommentar gilt Targeting iOS für das 6.

+0

+1 Wahr. Ich kam hierher, nachdem ich überrascht war, dass mein benutzerdefiniertes Popover begann Schatten nach dem Ausführen auf iOS 6 – Mazyod

+0

Danke für das Hinzufügen des Updates @ iOS6 - Ich war zurück zu überprüfen, unter iOS5 nach dem Sie Ihren Kommentar und Aufruf Super auf 'layoutSubviews' nicht hinzufügen der Schatten. –

+0

Ich bin in iOS 6 und meine UIPopoverBackgroundView zeigt nicht den Schatten :( –