2010-11-24 6 views
2

Ich habe eine UIAlertView wie folgt subclassed:Unterklasse UIAlertView nicht richtig in iOS 4.2 gezeichnet

@interface NarrationAlertView : UIAlertView { 
    UIImage * backgroundImage; //The image I want as custom background 
    UILabel * textualNarrationView; //The test I wanna be displayed on the view   
} 

Und es auf diese Weise umgesetzt:

- (id)initNarrationViewWithImage:(UIImage *)image{ 

    if (self = [super init]){ 
     UILabel * alertTextLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
     self.textualNarrationView = alertTextLabel; 
     [alertTextLabel release]; 
     [self addSubview:alertTextLabel]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    /* Here I draw the image as background */ 
    CGSize imageSize = self.backgroundImage.size; 
    [self.backgroundImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)]; 
} 

- (void)layoutSubviews { 
    /* To fit the text */ 
    [textualNarrationView sizeToFit]; 

    CGRect textRect = textualNarrationView.frame; 
    textRect.origin.x = (CGRectGetWidth(self.bounds) - CGRectGetWidth(textRect))/2; 
    textRect.origin.y = (CGRectGetHeight(self.bounds) - CGRectGetHeight(textRect))/2; 
    textRect.origin.y -= 70; 
    textualNarrationView.frame = textRect; 
} 

- (void)show{ 
    /* Showing the view */ 
    [super show]; 
    CGSize imageSize = self.backgroundImage.size; 
    self.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height); 
} 

Auf den früheren Versionen von iOS (ich bin immer auf dem Simulator testen) die Unterklasse läuft gut und wenn es angezeigt wird angezeigt das benutzerdefinierte Hintergrundbild korrekt gezeichnet und nur Text darauf, während in der Version 4.2 es zeichnet den UIAlertView klassischen Hintergrund (die blauen abgerundeten Ecken Rechteck) oben meines Bildes.

Was mache ich falsch? Jeder Vorschlag über UIAlertView-Programmierung und UIView wird ebenfalls geschätzt.

UPDATE Hat jemand eine UIAlertView-Ersatzklasse zum Teilen?

Antwort

5

Wir hatten ein ähnliches Problem mit UIAlertView in iOS 4.2; Wir haben das Layout angepasst, Textfelder hinzugefügt und die Schaltflächen neu angeordnet.

Dies wird keine beliebte Antwort sein, aber aufgrund der Änderungen an UIAlertView mussten wir die Verwendung vollständig für diesen Zweck aufgeben. Wir wussten immer, dass es sich um eine fragile Implementierung handelte, da die Anpassung von UIAlertView nicht offiziell unterstützt wird und Annahmen über die interne Struktur der Ansichtshierarchie gemacht werden, aber die Veröffentlichung von 4.2 brachte uns wirklich in den richtigen Gang.

Am Ende haben wir unser eigenes UI-Element implementiert, um das angepasste UIAlertView zu ersetzen.

+0

ich befürchten, dass, wie haben Sie den Pop-up-Effekt mit der Hintergrund schattierte Ansicht kombiniert erreicht? – rano

+0

Wir gingen eigentlich einen anderen Weg mit der UI, was früher ein Popup war, gleitet jetzt herunter/gleitet von oben nach oben. Ich habe in die Replikation des Pop-up-Effekts geschaut und diesen hilfreichen Link gefunden: http://delackner.com/blog/2009/12/mimicking-uialertviews-animated-transition/ –

+1

Ty Ich werde es mir ansehen – rano

3

Vor iOS 4.2 wurde das standardmäßige dunkelblaue abgerundete Rechteck von UIAlertView in drawRect gezeichnet. Das abgerundete Rechteck könnte durch Unterklassenbildung von UIAlertView und Implementieren von drawRect ohne Aufruf von super entfernt werden. In 4.2 ist das abgerundete Rechteck jedoch eine UIImageView-Unteransicht. die schnelle, einfache (nicht beste) Lösung: Wenn Sie keine UIImageView Instanzen Ihrer UIAlertView Unterklasse hinzufügen, können Sie einfach den Standard UIImageView entfernen, die durch die Beobachtung subview Ergänzungen geladen wird:

- (void)didAddSubview:(UIView *)subview { 
    if ([subview isMemberOfClass:[UIImageView class]]) { 
    [subview removeFromSuperview]; 
    } 
} 
+0

Es stürzt ab, wenn ich rotiere. irgendwelche Ideen? – Gal

+0

Entschuldigung, das war ein temporärer Hack, der für kurze Zeit in meinem Code lebte. Mein "Alarm" wurde komplizierter und ich implementierte meine eigene Version von UIAlertView. – firien

Verwandte Themen