2010-11-24 4 views
2

J'ai un sous-classé UIAlertView comme suit:UIAlertView pas sous-classé dessiné correctement dans iOS 4.2

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

et mis en œuvre ainsi:

- (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); 
} 

Sur les versions précédentes d'iOS (je suis toujours en testant sur le simulateur) la sous-classe fonctionne bien et lorsqu'elle est montrée, elle affiche l'image d'arrière-plan personnalisée dessinée correctement et juste le texte dessus, alors que dans la version 4.2 elle dessine l'arrière-plan classique UIAlertView (le rectangle arrondi aux coins bleus) sur le dessus de mon image.

Qu'est-ce que je fais mal? Toute suggestion concernant la programmation UIAlertView et UIView sera également appréciée.

MISE À JOUR Est-ce que quelqu'un a eu une classe de remplacement UIAlertView à partager?

Répondre

5

Nous avons eu un problème similaire avec UIAlertView dans iOS 4.2; nous personnalisions la mise en page, ajoutions des zones de texte et réorganisions les boutons.

Cela ne sera pas une réponse populaire, mais en raison des changements apportés à UIAlertView, nous avons dû abandonner l'utilisation entièrement à cette fin. Nous avons toujours su que c'était une implémentation fragile puisque la personnalisation/sous-classification de UIAlertView n'est pas officiellement prise en charge et fait des suppositions sur la structure interne de la hiérarchie des vues, mais la version 4.2 nous a vraiment poussé à la vitesse supérieure. En fin de compte, nous avons implémenté notre propre élément d'interface utilisateur pour remplacer l'UIAlertView personnalisé.

+0

je craignais que, comment avez-vous accompli l'effet pop-up combiné avec la vue ombrée de fond? – rano

+0

En fait, nous sommes allés différemment avec l'interface utilisateur, ce qui était auparavant une fenêtre déroulante glisse vers le bas/glisse du haut de l'écran. J'ai cherché à reproduire l'effet pop-up, et j'ai trouvé ce lien utile: http: //delackner.com/blog/2009/12/mimicking-uialertviews-animated-transition/ –

+1

Ty Je vais y jeter un coup d'œil – rano

3

Avant iOS 4.2 Le rectangle arrondi bleu foncé standard de UIAlertView a été dessiné dans drawRect. le rectangle arrondi pourrait être supprimé en sous-classant UIAlertView et en implémentant drawRect sans appeler super. Cependant, dans 4.2, le rectangle arrondi est une sous-vue UIImageView. la solution rapide, facile (pas le meilleur): Si vous n'êtes pas d'ajouter des instances de UIImageView à votre sous-classe UIAlertView vous pouvez simplement supprimer le UIImageView par défaut qui est chargé en observant les additions de sous-vue:

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

Il se bloque lorsque je fais une rotation. des idées? – Gal

+0

désolé, c'était un hack temporaire qui a vécu dans mon code pendant une courte période. Mon 'alerte' s'est compliquée et j'ai donc implémenté ma propre version d'UIAlertView. – firien

Questions connexes