32 votes

Comment personnaliser l'affichage d'une alerte iOS ?

Je veux créer un alert view dans mon application iOS. Par exemple, je veux mettre des images dans ce alert et changer sa couleur.

Je sais comment créer une normale UIAlertView mais existe-t-il un moyen de personnaliser un site Web de l'UE ? alert view ?

39voto

Nathan S. Points 3306

J'ai mis en place mon propre UIViewController que je peux habiller avec mes propres images. Je n'utilise généralement qu'un ou deux boutons, donc je cache le second s'il n'est pas utilisé. La vue est en fait de la taille de l'écran entier, donc elle bloque les touches derrière elle, mais elle est surtout transparente, donc l'arrière-plan est visible.

Lorsque je le présente, j'utilise quelques animations pour le faire rebondir comme la vue d'alerte d'Apple. Quelque chose comme ceci fonctionne :

-(void)initialDelayEnded {
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
    self.view.alpha = 1.0;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:kTransitionDuration/1.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(bounce1AnimationStopped)];
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
    [UIView commitAnimations];
}

- (void)bounce1AnimationStopped {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:kTransitionDuration/2];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(bounce2AnimationStopped)];
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
    [UIView commitAnimations];
}

- (void)bounce2AnimationStopped {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:kTransitionDuration/2];
    self.view.transform = CGAffineTransformIdentity;
    [UIView commitAnimations];
}

J'ai la possibilité d'intégrer un court délai dans la classe, de sorte que initialDelayEnded est appelé lorsque ce délai est terminé.

Lors de l'initialisation, je passe un objet et un sélecteur que je veux appeler lorsque chaque bouton est pressé, puis j'appelle le sélecteur approprié sur l'objet lorsqu'un bouton est pressé.

12voto

TomSwift Points 22012

Voici une vue d'alerte personnalisée que j'ai écrite et qui est un remplacement direct de UIAlertView. Vous pouvez définir une image de fond personnalisée ; il ne serait pas difficile de l'étendre pour supporter des couleurs de fond personnalisées.

https://github.com/TomSwift/TSAlertView

4voto

Nishant B Points 2580

Créez une sous-classe pour UIAlertView.

Et créer une classe commune pour la méthode Alert View. Ajoutez-y les deux méthodes ci-dessous.

#pragma mark Alert View Functions
+(void)alertViewWithYesNo:(NSString *)pstrTitle:(NSString *)pstrMessage:(int)pstrTagId:(id)pDelegate{
UIAlertView *objAlertNotify = [[UIAlertView alloc] init];
[objAlertNotify setDelegate:pDelegate];

[objAlertNotify addButtonWithTitle:@""];
[objAlertNotify addButtonWithTitle:@""];
int intTemp = 1;
for (UIView* view in [objAlertNotify subviews])
{
    if ([[[view class] description] isEqualToString:@"UIAlertButton"])
    {
        UILabel *theTitle = [[UILabel alloc] init];
        [theTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:g_AlertFontSize]];
        [theTitle setTextColor:[UIColor whiteColor]];
        switch (intTemp) {
            case 1:
                [theTitle setText:@"Yes"];
                //[theTitle setTextColor:g_ColorYes];
                break;
            case 2:
                [theTitle setText:@"No"];
                //[theTitle setTextColor:g_ColorNo];
                break;
        }
        intTemp++;

        [theTitle setBackgroundColor:[UIColor clearColor]];             
        [theTitle setTextAlignment:UITextAlignmentCenter];
        [view addSubview:theTitle];
    }
    else if ([[[view class] description] isEqualToString:@"UIThreePartButton"])
    {
        UILabel *theTitle = [[UILabel alloc] init];
        [theTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:g_AlertFontSize]];
        [theTitle setTextColor:[UIColor whiteColor]];
        switch (intTemp) {
            case 1:
                [theTitle setText:@"Yes"];
                //[theTitle setTextColor:g_ColorYes];
                break;
            case 2:
                [theTitle setText:@"No"];
                //[theTitle setTextColor:g_ColorNo];
                break;
        }
        intTemp++;

        [theTitle setBackgroundColor:[UIColor clearColor]];             
        [theTitle setTextAlignment:UITextAlignmentCenter];
        [view addSubview:theTitle];
    }
}
[objAlertNotify setTag:pstrTagId];
[objAlertNotify setTitle:pstrTitle];
[objAlertNotify setMessage:pstrMessage];
[objAlertNotify show];
}

+(void)alertViewBtnText:(UIAlertView *)alertView{
for (UIView* view in [alertView subviews])
{
    //NSLog(@"%@", [[view class] description]);

    if ([[[view class] description] isEqualToString:@"UIAlertButton"])
    {   
        for (UILabel *lbl in [view subviews])
        {   
            //NSLog(@"%@", [[lbl class] description]);

            if ([[[lbl class] description] isEqualToString:@"UILabel"])
            {
                CGRect frame = [view bounds];

                CGSize maximumLabelSize = CGSizeMake(320,480);
                CGSize expectedLabelSize = [lbl.text sizeWithFont:lbl.font constrainedToSize:maximumLabelSize lineBreakMode:lbl.lineBreakMode];
                CGRect newFrame = lbl.frame;
                newFrame.origin.x = newFrame.origin.x - expectedLabelSize.width/2;
                newFrame.size.height = expectedLabelSize.height;
                newFrame.size.width = expectedLabelSize.width;
                lbl.frame = newFrame;
                //frame.size.width = 320.0;
                //frame.size.height = 480.0;

                lbl.frame = frame;
                [lbl setCenter:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
            }
        }
    }
    else if ([[[view class] description] isEqualToString:@"UIThreePartButton"])
    {   
        for (UILabel *lbl in [view subviews])
        {   
            CGRect frame = [view bounds];

            CGSize maximumLabelSize = CGSizeMake(320,480);
            CGSize expectedLabelSize = [lbl.text sizeWithFont:lbl.font constrainedToSize:maximumLabelSize lineBreakMode:lbl.lineBreakMode];
            CGRect newFrame = lbl.frame;
            newFrame.origin.x = newFrame.origin.x - expectedLabelSize.width/2;
            newFrame.size.height = expectedLabelSize.height;
            newFrame.size.width = expectedLabelSize.width;
            lbl.frame = newFrame;
            //frame.size.width = 320.0;
            //frame.size.height = 480.0;

            lbl.frame = frame;
            [lbl setCenter:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
        }
    }
}
}

Maintenant, dans n'importe quelle classe, vous utilisez cette alerte personnalisée : Ajouter ci-dessous :

#pragma mark UIAlertViewDelegate
-(void)willPresentAlertView:(UIAlertView *)alertView{

if(alertView==objAlertMsg){
    /*clsCommonFuncDBAdapter *objclsCommonFuncDBAdapter = [[clsCommonFuncDBAdapter alloc] init];
    float newHeight = [objclsCommonFuncDBAdapter getAlertHeightByMessage:alertView.frame.size.width :alertView.message] + [g_AlertExtraHeight intValue];
    [objclsCommonFuncDBAdapter release];

    //NSLog(@"X = %f, Y = %f, Widht = %f, Height = %f", alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, alertView.frame.size.height);
    //[alertView setFrame:CGRectMake(alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, 110.0)];
    [alertView setFrame:CGRectMake(alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, newHeight)];*/
}

[clsCommonFuncDBAdapter alertViewBtnText:alertView];

}

Pour l'appeler : Utilisez comme ci-dessous :

-(void)askForGPSEnable{
[clsCommonFuncDBAdapter alertViewWithYesNo:msgGPSTitle :msgGPSMessage :0 :self];
}

Faites-moi savoir en cas de difficulté.

2voto

Jasarien Points 35353

Vous devrez créer votre propre vue personnalisée et mettre en œuvre certains comportements de style de vue d'alerte, comme l'affichage modal, l'atténuation de l'arrière-plan, l'animation en entrée et en sortie, etc.

Le SDK ne permet pas de personnaliser une UIAlertView au-delà du texte ou des boutons.

2voto

user333242 Points 26

http://iphonedevelopment.blogspot.com/2010/05/custom-alert-views.html http://www.skylarcantu.com/blog/2009/08/14/custom-uialertview-color-chooser/

Vous pouvez utiliser les liens ci-dessus pour des alertes personnalisées. J'espère qu'ils vous seront utiles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X