web-dev-qa-db-fra.com

Ajout d'images aux boutons UIActionSheet comme dans UIDocumentInteractionController

Est-il possible d’ajouter une image aux boutons de la UIActionSheet telle qu’elle est vue dans UIDocumentInteractionController? Si oui, s'il vous plaît laissez-moi savoir comment cela se fait.

33
Ahmad Kayyali

Essayez de cette façon, j'espère que cela pourra vous aider.

UIActionSheet * action = [[UIActionSheet alloc] 
                      initWithTitle:@"Title" 
                      delegate:self 
                      cancelButtonTitle:@"Cancel" 
                      destructiveButtonTitle:nil 
                      otherButtonTitles:@"",nil];

[[[action valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"yourImage.png"] forState:UIControlStateNormal];

[[[action valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"yourImage_Highlighted.png"] forState:UIControlStateHighlighted];
27
Amit

Il est possible d'ajouter des images (pour être exact: des icônes ou des symboles) aux boutons d'une UIActionSheet (ou une UIAlertView) sans charger de fichiers d'image ni manipuler de (sous) vues. Dans ces classes, les boutons sont spécifiés par leurs titres, qui sont des chaînes. Il est donc évident d’utiliser des symboles, que l’on peut également spécifier par des chaînes. La première que j'ai créée utilisait symboles Unicode.

J'ai ensuite découvert que plusieurs d'entre eux sont rendus sous forme d'icônes sympas sur iOS et, comme on peut le voir pour plusieurs symboles, dans le Afficheur de personnages sur Mac OS également. Ainsi, les symboles peuvent être utilisés partout où une chaîne peut être spécifiée.

Les inconvénients de cette approche sont les suivants:

  • Vous êtes limité à des symboles prédéfinis.
  • Tous les symboles ne sont pas restitués comme ils le devraient (par exemple, \u29C9).
  • Il peut y avoir des changements dans l'apparence de certains symboles sur différentes versions d'iOS (par exemple, \U0001F533 sur iOS 5 et 6).

Voici quelques symboles intéressants parmi d'autres:

Si vous voulez vérifier rapidement à quoi ressemble un symbole (du moins sous Mac OS), vous pouvez utiliser la calculatrice . Vérifiez définitivement dans le simulateur: Par exemple, \u2B1C n'est pas une icône dans la calculatrice 10.7.1.

Captures d'écran:

UIActionSheet

UIActionSheet

Titres des boutons:

@"\U0001F6A9 \U0001F4CC \u26F3 \u2690 \u2691 \u274F \u25A4 Test"
@"\U0001F4D6 \U0001F30E \U0001F30F \u25A6 \U0001F3C1 \U0001F332 \U0001F333 \U0001F334 Test"

UIAlertView

enter image description here

Titre du bouton:

@"\u26A0 Yes"

UITableViewCell avec case à cocher et autres icônes

UITableViewCell

71
Eddie Gasparian

UIActionSheet standard ne prend pas en charge les images.

Une façon d'ajouter une image à la UIActionSheet consiste à ajouter une sous-vue à la UIActionSheet. Il suffit de mettre en œuvre la méthode UIActionSheetDelegate willPresentActionSheet: comme ceci:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
     UIImageView* buttonImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picturename.png"]];
     // Set the frame of the ImageView that it's over the button.
     [actionSheet addSubview:buttonImage];
     [buttonImage release]; // only if you don't need this anymore
}

Je ne sais pas si l'image répond aux touches, mais vous pouvez créer une UIActionSheet comme la UIDocumentInteractionController.

6
audience

Voici une façon de procéder: https://github.com/levey/LeveyPopListViewenter image description here

5
RawMean
- (IBAction)actionSheetButtonPressed:(id)sender {
UIAlertController * view=   [UIAlertController
                             alertControllerWithTitle:@"Share "
                             message:@"Select your current status"
                             preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction* online = [UIAlertAction
                         actionWithTitle:@"Facebook"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             //Do some thing here
                             [view dismissViewControllerAnimated:YES completion:nil];
                         }];
UIAlertAction* offline = [UIAlertAction
                          actionWithTitle:@"Google+"
                          style:UIAlertActionStyleDefault
                          handler:^(UIAlertAction * action)
                          {
                              [view dismissViewControllerAnimated:YES completion:nil];
                          }];
UIAlertAction* doNotDistrbe = [UIAlertAction
                               actionWithTitle:@"LinkedIn"
                               style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action)
                               {
                                   [view dismissViewControllerAnimated:YES completion:nil];
                               }];
UIAlertAction* away = [UIAlertAction
                       actionWithTitle:@"Twitter"
                       style:UIAlertActionStyleDestructive
                       handler:^(UIAlertAction * action)
                       {
                           [view dismissViewControllerAnimated:YES completion:nil];

                       }];
UIAlertAction* cancel = [UIAlertAction
                     actionWithTitle:@"Cancel"
                     style:UIAlertActionStyleDefault
                     handler:^(UIAlertAction * action)
                     {
                     }];

[online setValue:[[UIImage imageNamed:@"facebook.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[offline setValue:[[UIImage imageNamed:@"google-plus.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[doNotDistrbe setValue:[[UIImage imageNamed:@"linkedin.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[away setValue:[[UIImage imageNamed:@"Twitter.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];

[view addAction:online];
[view addAction:away];
[view addAction:offline];
[view addAction:doNotDistrbe];

[view addAction:cancel];

[self presentViewController:view animated:YES completion:nil];

}

4
Mannam Brahmam

Vous pouvez obtenir le titre du bouton d'action à partir de l'objet actionSheet à l'aide de la touche " _buttons " et définir l'image du bouton. 

UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"Title" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Facebook", @"Twitter", @"Google +", @"E - mail", @"Send Message",nil];

[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"fb_icon1.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:1] setImage:[UIImage imageNamed:@"Tweet_icon1.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:2] setImage:[UIImage imageNamed:@"googleplus_icon1.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:3] setImage:[UIImage imageNamed:@"mail_icon.png"] forState:UIControlStateNormal];
[[[actionSheet valueForKey:@"_buttons"] objectAtIndex:4] setImage:[UIImage imageNamed:@"message_icon.png"] forState:UIControlStateNormal];

for (UIView *subview in actionSheet.subviews) {
    if ([subview isKindOfClass:[UIButton class]]) {
        UIButton *button = (UIButton *)subview;
        [button setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
    }
}

[actionSheet showInView:self.view];
3
Alpesh Prajapati

Je viens de créer une classe émulant l'apparence d'une feuille UIAction à l'aide de cellules de tableau prenant en charge des images et du texte pour chaque ligne. Il utilise également des blocs d'interaction, prend en charge les iPhone et iPad, les popups d'un UITabBarItem sur iPad et la mise en file d'attente de plusieurs feuilles. Toujours en développement, mais n'hésitez pas à le cloner à partir de Github:

http://github.com/azplanlos/SIActionSheet

L'utilisation est assez simple, voici un exemple:

SIActionSheet* mySheet = [SIActionSheet actionSheetWithTitle:@"Action Sheet title"
    andObjects:[NSArray arrayWithObjects:
        [SIActionElement actionWithTitle:@"Item 1"
            image:[UIImage imageNamed:@"image"]
            andAction:^{NSLog(@"action 1");}]
    , nil]
    completition:^(int num) {
        NSLog(@"pressed %i", num);
    } cancel:^{NSLog(@"canceled");}];

mySheet.followUpSheet = anotherSheet;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        [mySheet show];
else
        [mySheet showFromTabBarItem:item inTabBar:tabBar];

Si vous rencontrez des problèmes, s'il vous plaît faites le moi savoir. J'espère que cela aide beaucoup de personnes ayant le même problème que moi ...

2
Andreas Zöllner

Pour iOS 8, faites référence à ceci

if( [UIAlertController class] ){

    UIAlertController *view     = [UIAlertController alertControllerWithTitle:@"Main Title" 
                                                                      message:@"What do you want to do?"
                                                               preferredStyle:UIAlertControllerStyleActionSheet];

    UIAlertAction *firstAA       = [UIAlertAction actionWithTitle:@"Beep Beep"
                                                           style:UIAlertActionStyleDefault
                                                         handler:^( UIAlertAction *action ){

                                                             [view dismissViewControllerAnimated:YES
                                                                                      completion:nil];
                                                         }];
    [firstAA setValue:[UIImage imageNamed:@"your-icon-name"] forKey:@"image"];
    [view addAction:firstAA];

    UIAlertAction *cancelAA     = [UIAlertAction actionWithTitle:@"Cancel"
                                                           style:UIAlertActionStyleCancel
                                                         handler:^( UIAlertAction *action ){

                                                             [self deselectTableViewRow];

                                                             [view dismissViewControllerAnimated:YES
                                                                                      completion:nil];
                                                         }];
    [view addAction:cancelAA];

    [self presentViewController:view
                       animated:YES
                     completion:nil];
}
else {

    UIActionSheet *sheet    = [[UIActionSheet alloc] initWithTitle:@"What do you want to do?"
                                                          delegate:(id)self
                                                 cancelButtonTitle:nil
                                            destructiveButtonTitle:nil
                                                 otherButtonTitles:nil];

    [sheet addButtonWithTitle:@"title"];

    [[[sheet valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"your-icon-name.png"] forState:UIControlStateNormal];

    sheet.cancelButtonIndex = [sheet addButtonWithTitle:@"Cancel"];
    [sheet showInView:self.view];
}
2
Keith Yeoh

Je sais que la réponse est très tardive, mais j'ai trouvé un autre moyen d'afficher l'image dans la fiche d'action:

self.actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select Image:" delegate:self cancelButtonTitle:@"Cancel"destructiveButtonTitle:nil otherButtonTitles: @"Image1", @"Image2", @"Image3", @"Image4", @"Image5", @"Image6", @"Image7", @"Image8",@"Image9", @"Image10", @"Image11", @"Image12", @"Image13", @"Image14", @"Image15", nil];

self.actionSheet.tag = 1;
for (id button in [self.actionSheet valueForKey:@"_buttons"])
 {
     UIImageView* buttonImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[button titleForState:UIControlStateNormal]]];
     [buttonImage setFrame:CGRectMake(5, 5,35,35)];
     [button addSubview:buttonImage];
 }

 [self.actionSheet showInView:[UIApplication sharedApplication].keyWindow];
1
Prince Agrawal
    NSString* strUrl=[MLControl shared].currentServerUrl;
    for( MLServerUrl *title in [MLControl shared].arrServerUrl)  {
        NSString* strShow=title.name;
        if ([strUrl isEqualToString: title.url]) {
            strShow=[NSString stringWithFormat:@"√ %@",strShow];
        }else{
            strShow=[NSString stringWithFormat:@"  %@",strShow];
        }

        [chooseImageSheet addButtonWithTitle:strShow];
    }

   // [[[chooseImageSheet valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"ic_check_black_18dp.png"] forState:UIControlStateNormal];
    chooseImageSheet.actionSheetStyle = UIActionSheetStyleDefault;
    [chooseImageSheet showFromRect:btnRc inView:sender animated:YES];
1
Gank

J'ai trouvé cette extension de catégorie fonctionne dans ios7.1 pour ajouter une image/icône aux boutons d'un UIActionSheet, avec quelques réserves ... 

@interface UIActionSheet (GSBActionSheetButtons)
- (void)buttonAtIndex:(NSUInteger)index setImage:(UIImage *)image forState:(UIControlState)state;
@end

@implementation UIActionSheet (GSBActionSheetButtons)
- (void)buttonAtIndex:(NSUInteger)index setImage:(UIImage *)image forState:(UIControlState)state
{
    for (UIView* view in self.subviews) {
        if ([view isKindOfClass:[UIButton class]]) {
            if (index-- == 0) {
                UIButton *button = (UIButton*)view;
                [button setImage:image forState:state];
                button.imageView.contentMode = UIViewContentModeScaleAspectFit;
                button.imageEdgeInsets = UIEdgeInsetsMake(2,0,2,0);
                break;
            }
        }
    }
}

Et pour l'utiliser:

[self.sharePopup buttonAtIndex:2 setImage:[UIImage imageNamed:@"Twitter.png"] forState:UIControlStateNormal];

Les mises en garde:

  • Bien que UIActionSheet redimensionne correctement votre image à droite height pour le bouton, il ne semble pas modifier en conséquence l'image view width; D'où la nécessité pour UIViewContentModeScaleAspectFit d'empêcher que l'image ne soit écrasée. Cependant, la largeur du cadre imageview est toujours dans sa taille originale. Par conséquent, si votre image était grande (ou plus précisément large), vous aurez un écart gênant entre l'image centrée (rétrécie) et le texte du bouton. Je n'ai trouvé aucun moyen de contourner cela. même l'ajout par programme d'une contrainte explicite largeur = hauteur à la vue d'image semble être ignoré!? [des idées?]. Au final, assurez-vous que votre image a la bonne hauteur pour commencer (par exemple environ 45 pixels sur un iPhone 4S) ou vous obtiendrez un écart de plus en plus grand entre l’image du bouton et le texte.

  • Plus grave, dès que vous ajoutez une image au bouton, la feuille UIActionSheet semble automatiquement faire en sorte que le texte du bouton soit en gras (!). Je ne sais pas pourquoi et je ne sais pas comment empêcher cela [des idées?] 

  • Enfin, cette solution repose sur le fait que les sous-vues de UIActionSheet soient dans le même ordre que celui du bouton. Ceci est vrai pour une poignée de boutons, mais (apparemment) lorsque vous avez beaucoup d'éléments dans votre UIActionSheet Apple se moque de l'indexation [mais vous aurez toujours des problèmes avec ceci dans actionSheet: clickedButtonAtIndex: lorsque vous essayez quel bouton a été exploité ...]

  • Oh, l'imageEdgeInsets: est facultatif - j'insère chaque image dans le bouton avec quelques pixels, de sorte que les images ne se touchent pas verticalement.

    [Opinion: étant donné les bizarreries ci-dessus, j'ai l'impression que Apple ne veut vraiment pas que les gens s'amusent avec leurs feuilles d'actions. À un moment donné, vous devrez probablement mordre la balle et mettre en place votre propre popup modal; il n'y a que très peu de maltraitance de ces feuilles UIAction ...]

1
tiritea

Depuis iOS 8.0, vous pouvez utiliser UIAlertController. Dans UIAlertController, chaque élément de bouton est appelé UIAlertAction et s'ajoute en conséquence.

Vous pouvez vérifier ma réponse

0
Jaha Rabari