È ansible aggiungere un’immagine ai pulsanti di UIActionSheet
come visto in UIDocumentInteractionController
? Se è così, per favore fammi sapere come è fatto.
Prova in questo modo, spero che possa aiutarti.
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];
Vi è la possibilità di aggiungere immagini (per essere esatti: icone o simboli) ai pulsanti di un UIActionSheet
(o UIAlertView
) senza caricare file di immagine o giocherellare con le viste (secondarie). In queste classi i pulsanti sono specificati dai loro titoli, che sono stringhe. Quindi è ovvio usare i simboli, che si possono specificare anche con le stringhe. Il primo che ho scoperto è stato l’utilizzo di simboli unicode .
Poi ho scoperto che molti di questi sono resi come icone carine su iOS e come si può vedere anche per diversi simboli nel Visualizzatore di caratteri su Mac OS. Pertanto, i simboli possono essere utilizzati in realtà ovunque sia ansible specificare una stringa.
Gli svantaggi di questo approccio sono:
\u29C9
). \U0001F533
su iOS 5 e 6). Ecco alcuni simboli interessanti tra gli altri:
Se vuoi controllare rapidamente come appare un simbolo (almeno su Mac OS), puoi usare la Calcolatrice . Controlla definitivamente nel simulatore: Ad esempio \u2B1C
non è un’icona in Calculator 10.7.1.
Screenshots:
UIActionSheet
Titoli pulsante:
@"\U0001F6A9 \U0001F4CC \u26F3 \u2690 \u2691 \u274F \u25A4 Test" @"\U0001F4D6 \U0001F30E \U0001F30F \u25A6 \U0001F3C1 \U0001F332 \U0001F333 \U0001F334 Test"
UIAlertView
Titolo del pulsante:
@"\u26A0 Yes"
UITableViewCell
con checkbox e altre icone
Lo standard UIActionSheet non supporta le immagini.
Un modo per aggiungere un’immagine a UIActionSheet
è aggiungere una sottoview a UIActionSheet
. Basta implementare il metodo UIActionSheetDelegate willPresentActionSheet: come questo:
- (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 }
Non sono sicuro che l’immagine risponda ai tocchi, ma puoi creare un UIActionSheet
come UIDocumentInteractionController
.
Ecco un modo per farlo: https://github.com/levey/LeveyPopListView
È ansible ottenere il titolo del pulsante di azione dall’object actionSheet con il tasto ” _buttons ” e impostare l’immagine del pulsante.
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];
- (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];
}
Ho appena creato una class che emula l’aspetto di un UIActionSheet usando celle di tabella che supportano immagini e testo per ogni riga. Utilizza anche blocchi per l’interazione, supporta iPhone e iPad, popup da un UITabBarItem su iPad e l’accodamento di più fogli. Ancora in sviluppo, ma sentitevi liberi di clonarlo da Github:
http://github.com/azplanlos/SIActionSheet
L’utilizzo è abbastanza semplice, ecco un esempio:
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];
Se incontri qualche problema, per favore fammelo sapere. Spero che questo aiuti un sacco di persone che hanno lo stesso problema come me …
Per iOS 8, fare riferimento a questo
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]; }
So che è una risposta molto tarda, ma ho trovato un altro modo per mostrare l’immagine nel foglio di azione:
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];
Ho trovato questa estensione di categoria funziona in iOS7.1 per aggiungere un’immagine / icona ai pulsanti in un UIActionSheet, con alcune avvertenze …
@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; } } } }
E per usarlo:
[self.sharePopup buttonAtIndex:2 setImage:[UIImage imageNamed:@"twitter.png"] forState:UIControlStateNormal];
I caveat:
Anche se UIActionSheet esegue automaticamente l’autoscatto dell’immagine alla giusta altezza per il pulsante, non sembra modificare corrispondentemente la larghezza della vista di immagini ; da qui la necessità di UIViewContentModeScaleAspectFit per evitare che l’immagine venga schiacciata. Tuttavia, la larghezza del frame dell’immagine è sempre quella originale, quindi se l’immagine è grande (o più precisamente ampia), si otterrà un gap fastidioso tra l’immagine centrata (ridotta) e il testo del pulsante. Non ho trovato modo di aggirare questo; anche l’aggiunta programmatica di un larghezza esplicita = il vincolo di altezza alla vista immagine sembra essere ignorata !? [qualche idea?]. Risultato netto, assicurati che l’immagine abbia l’altezza giusta per iniziare (ad es. Circa 45 pixel su un iPhone 4S) o otterrai uno spazio sempre più grande tra l’immagine del pulsante e il testo.
Più grave, non appena aggiungi un’immagine al pulsante, sembra che UIActionSheet faccia automaticamente in grassetto il testo del pulsante (!). Non so perché e non so come prevenire questo [qualche idea?]
Infine, questa soluzione si basa sul fatto che le subviews di UIActionSheet siano nello stesso ordine in cui il pulsante viene indicizzato. Questo è vero per una manciata di pulsanti, ma (apparentemente) quando hai un sacco di elementi nel tuo UIActionSheet. Apple fa il muck con l’indicizzazione [ma avrai comunque dei problemi in actionSheet: clickButtonAtIndex: quando proverai a capire quale pulsante è stato toccato …]
Oh, imageEdgeInsets: è opzionale – Inserisco ogni immagine di un paio di pixel all’interno del pulsante in modo che le immagini non si tocchino l’un l’altra verticalmente.
[Opinione: vista la stranezza di cui sopra, ho la sensazione che Apple non voglia che le persone masticino con i loro fogli di azione. A un certo punto probabilmente dovrai mordere la pallottola e solo implementare il tuo popup modale; c’è solo così tanto maneggio che questi UIActionSheets accolgono …]
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];
Da iOS 8.0 puoi usare UIAlertController. In UIAlertController, ogni elemento del pulsante è noto come UIAlertAction che aggiunge di conseguenza.
Puoi controllare la mia risposta