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.
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];
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:
\u29C9
).\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
Titres des boutons:
@"\U0001F6A9 \U0001F4CC \u26F3 \u2690 \u2691 \u274F \u25A4 Test"
@"\U0001F4D6 \U0001F30E \U0001F30F \u25A6 \U0001F3C1 \U0001F332 \U0001F333 \U0001F334 Test"
UIAlertView
Titre du bouton:
@"\u26A0 Yes"
UITableViewCell
avec case à cocher et autres icônes
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
.
Voici une façon de procéder: https://github.com/levey/LeveyPopListView
- (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];
}
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];
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 ...
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];
}
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];
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];
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 ...]
Depuis iOS 8.0, vous pouvez utiliser UIAlertController
. Dans UIAlertController
, chaque élément de bouton est appelé UIAlertAction
et s'ajoute en conséquence.