Aggiunta di immagini ai pulsanti UIActionSheet come in UIDocumentInteractionController

È 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:

  • Sei limitato a simboli predefiniti.
  • Non tutti i simboli sono resi come dovrebbero (ad esempio \u29C9 ).
  • Ci possono essere cambiamenti nell’aspetto di alcuni simboli su diverse versioni di iOS (es. \U0001F533 su iOS 5 e 6).

Ecco alcuni simboli interessanti tra gli altri:

  • Simboli e pittogrammi vari
  • Simboli vari
  • Simboli di trasporto e mappa
  • Dingbats

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

UIActionSheet

Titoli pulsante:

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

UIAlertView

inserisci la descrizione dell'immagine qui

Titolo del pulsante:

 @"\u26A0 Yes" 

UITableViewCell con checkbox e altre icone

UITableViewCell

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 .

È 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