Ajouter des Images aux boutons UIActionSheet comme dans UIDocumentInteractionController

est-il possible d'ajouter une image aux boutons du UIActionSheet comme vu dans UIDocumentInteractionController ? Si oui, s'il vous plaît laissez-moi savoir comment il est fait.

33
demandé sur Community 2011-05-26 00:28:06

12 réponses

essayez de cette façon, j'espère que cela peut 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
répondu Amit 2011-05-26 10:28:01

il est possible d'ajouter des images (pour être exact: des icônes ou des symboles) aux boutons d'un UIActionSheet (ou d'un UIAlertView ) sans charger de fichiers d'image ou jouer avec des vues (sub). 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 spécifier aussi par des chaînes. Le premier que j'ai trouvé était d'utiliser symboles unicode .

Puis Je découvert que plusieurs d'entre eux sont rendus comme de belles icônes sur iOS et comme on peut voir pour plusieurs symboles dans le caractère spectateur sur Mac OS, aussi. Ainsi, les symboles peuvent être utilisés pratiquement partout une chaîne de caractères peut être définie.

Les inconvénients de cette approche sont:

  • vous êtes limité aux symboles prédéfinis.
  • tous les symboles ne sont pas rendus comme ils devraient l'être (par exemple \u29C9 ).
  • il peut y avoir des changements dans l'apparence de certains symboles sur différentes versions de iOS (par exemple \U0001F533 sur iOS 5 et 6).

voici quelques symboles intéressants parmi d'autres:

si vous voulez rapidement vérifier comment un symbole ressemble (au moins sur Mac OS), vous pouvez utiliser la calculatrice . Vérifiez certainement dans le simulateur: par exemple \u2B1C n'est pas une icône dans la calculatrice 10.7.1.

Screenshots:

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
répondu Eddie Gasparian 2013-03-29 09:29:27

la fiche Uiactionstandard ne supporte pas les images.

une façon d'ajouter une image au UIActionSheet est d'ajouter un sous-vue au 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 suis pas sûr que l'image réponde aux touches, mais vous pouvez construire un UIActionSheet comme le UIDocumentInteractionController .

6
répondu audience 2013-01-03 00:03:27

Voici une façon de le faire: https://github.com/levey/LeveyPopListView enter image description here

5
répondu RawMean 2012-07-18 05:43:55

vous pouvez obtenir le titre du bouton d'action de l'objet actionSheet par 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
répondu Alpesh Prajapati 2014-09-04 10:35:43
- (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];

}

3
répondu Mannam Brahmam 2015-12-09 06:16:14

je viens de créer une classe émulant l'apparence d'une feuille D'Uiaction en utilisant des cellules de tableau supportant des images et du texte pour chaque ligne. Il utilise également des blocs pour l'interaction, prend en charge iPhone et iPad, popup à partir d'un UITabBarItem sur iPad et la queue de plusieurs feuilles. Toujours en développement, mais n'hésitez pas à le cloner à partir de Github:

http://github.com/azplanlos/SIActionSheet

L'utilisation de

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
répondu Andreas Zöllner 2013-05-19 16:14:34

pour iOS 8, se référer à ce

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
répondu Keith Yeoh 2015-02-25 07:26:19

je sais qu'il est très tard réponse, mais j'ai trouvé une autre façon de montrer l'image dans la feuille 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
répondu Prince Agrawal 2014-02-26 08:51:45

j'ai trouvé cette catégorie extension fonctionne dans ios7.1 pour ajouter une image / icône aux boutons d'une feuille D'Uiaction, avec quelques mises en garde...

@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 à son utilisation:

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

Les mises en garde:

  • bien que le UIActionSheet ne correctement autosize votre image à la droite hauteur pour le bouton, il ne semble pas changer en conséquence l'imageview largeur ; d'où la nécessité pour le UIViewContentModeScaleAspectFit d'empêcher l'image de se faire écrabouiller. Cependant, la largeur de cadre d'imageview est toujours la pleine taille d'origine, donc si votre image était grande (ou plus précisément large) alors vous obtiendrez un trou ennuyeux 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 programmatique d'une contrainte explicite de largeur=hauteur à l'imageview semble être ignoré!? [toutes les idées?]. Net résultat, assurez-vous que votre image est à peu près 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 de bouton et le texte.

  • plus grave, dès que vous ajoutez une image au bouton, la feuille D'Uiaction semble causer automatiquement le texte du bouton pour être en caractères gras (!). Je ne sais pas pourquoi et je sais pas comment l'empêcher [les idées?]

  • enfin, cette solution repose sur les sous-vues UIActionSheet pour être dans le même ordre que le bouton sont indexés. Cela est vrai pour une poignée de boutons, mais (apparemment) lorsque vous avez beaucoup d'éléments dans votre Uiactionsheet Pomme tourne autour de l'indexation [mais vous aurez des problèmes avec cela de toute façon dans actionSheet:clickedButtonAtIndex: lorsque vous essayez de comprendre quel bouton a été tapped...]

Oh, la imageEdgeInsets: optionnel - j'insère chaque image un couple de pixels à l'intérieur du bouton de sorte que les images ne se touchent pas verticalement.

[Opinion: étant donné les bizarreries ci-dessus, J'ai le sentiment Qu'Apple ne veut pas que les gens se moquent de avec leurs feuilles d'action. À un moment donné, vous aurez probablement à mordre-la-balle et tout simplement mettre en œuvre votre propre popup modal; Il ya seulement tant manhandling ces feuilles D'Uiaction seront accommodants...]

1
répondu tiritea 2014-08-23 03:31:21
    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
répondu Gank 2014-12-18 06:05:44

de iOS 8.0 vous pouvez utiliser UIAlertController. Dans UIAlertController, chaque élément de bouton est connu comme UIAlertAction qui ajoutent en conséquence.

, Vous pouvez vérifier ma réponse

0
répondu Jaha Rabari 2017-05-23 12:08:51