webentwicklung-frage-antwort-db.com.de

Hinzufügen von Bildern zu UIActionSheet-Schaltflächen wie in UIDocumentInteractionController

Ist es möglich, ein Bild zu den Schaltflächen der UIActionSheet hinzuzufügen, wie in UIDocumentInteractionController dargestellt? Wenn ja, lass mich wissen, wie es gemacht wird.

33
Ahmad Kayyali

Versuchen Sie es auf diese Weise, ich hoffe es kann Ihnen helfen.

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

Es besteht die Möglichkeit, Bilder (genauer: Symbole oder Symbole) zu den Schaltflächen einer UIActionSheet (oder einer UIAlertView) hinzuzufügen, ohne Bilddateien zu laden oder mit (Unter-) Ansichten herumzuspielen. In diesen Klassen werden Schaltflächen anhand ihrer Titel angegeben, bei denen es sich um Strings handelt. Es ist also naheliegend, Symbole zu verwenden, die man auch durch Strings angeben kann. Das erste, was mir einfiel, war Unicode-Symbole.

Dann entdeckte ich, dass einige von ihnen als Nice-Icons auf iOS gerendert werden und wie man unter Mac OS auch mit mehreren Symbolen im Character Viewer sehen kann. So können die Symbole eigentlich überall verwendet werden, wo eine Zeichenfolge angegeben werden kann.

Die Nachteile dieses Ansatzes sind:

  • Sie sind auf vordefinierte Symbole beschränkt.
  • Nicht alle Symbole werden so wiedergegeben, wie sie sollten (z. B. \u29C9).
  • In einigen iOS-Versionen können Änderungen am Erscheinungsbild einiger Symbole auftreten (z. B. \U0001F533 unter iOS 5 und 6).

Hier sind einige interessante Symbole unter anderem:

Wenn Sie schnell überprüfen möchten, wie ein Symbol aussieht (zumindest unter Mac OS), können Sie den Rechner verwenden. Überprüfen Sie den Simulator auf jeden Fall: Zum Beispiel ist \u2B1C kein Symbol in Rechner 10.7.1.

Screenshots:

UIActionSheet

UIActionSheet

Schaltflächentitel:

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

UIAlertView

enter image description here

Button-Titel:

@"\u26A0 Yes"

UITableViewCell mit Kontrollkästchen und anderen Symbolen

UITableViewCell

71
Eddie Gasparian

Das Standard-UIActionSheet unterstützt keine Bilder.

Eine Möglichkeit, der UIActionSheet ein Bild hinzuzufügen, besteht darin, der UIActionSheet eine Unteransicht hinzuzufügen. Implementieren Sie einfach die UIActionSheetDelegate-Methode willPresentActionSheet: wie folgt:

- (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
}

Ich bin nicht sicher, ob das Bild auf Berührungen reagiert, aber Sie können eine UIActionSheet wie dieUIDocumentInteractionController erstellen.

6
audience

Gehen Sie folgendermaßen vor: 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

Sie können den Titel der Aktionsschaltfläche vom actionSheet-Objekt mit dem Schlüssel " _buttons " abrufen und das Schaltflächenbild festlegen. 

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

Ich habe gerade eine Klasse erstellt, die das Aussehen eines UIActionSheet simuliert, wobei Tabellenzellen verwendet werden, die Bilder und Text für jede Zeile unterstützen. Es verwendet auch Blöcke für die Interaktion, unterstützt iPhone und iPad, Popup von einem UITabBarItem auf dem iPad und das Einreihen mehrerer Blätter. Noch in der Entwicklung, aber Sie können es gerne von Github klonen:

http://github.com/azplanlos/SIActionSheet

Die Verwendung ist recht einfach, hier ein Beispiel:

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];

Wenn Sie Probleme haben, lassen Sie es mich wissen. Ich hoffe, das hilft vielen Menschen, die das gleiche Problem haben wie ich ...

2

Beziehen Sie sich bei iOS 8 darauf

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

Ich weiß, es ist eine sehr späte Antwort, aber ich habe einen anderen Weg gefunden, ein Bild im Aktionsblatt darzustellen:

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

Diese Kategorieerweiterung funktioniert in ios7.1, um den Schaltflächen in einem UIActionSheet ein Bild/Symbol hinzuzufügen, mit einigen Vorbehalten ... 

@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;
            }
        }
    }
}

Und um es zu benutzen:

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

Die Vorbehalte:

  • Obwohl das UIActionSheet Ihr Bild automatisch auf die richtige Höhe für die Schaltfläche height skaliert, scheint die Bildansicht width nicht entsprechend zu ändern. Daher muss UIViewContentModeScaleAspectFit verhindern, dass das Bild beschädigt wird. Die Bildbreite der Bildansicht ist jedoch immer noch die ursprüngliche Größe. Wenn Ihr Bild groß (oder genauer breit) ist, entsteht eine lästige Lücke zwischen dem zentrierten (geschrumpften) Bild und dem Schaltflächentext. Ich habe keinen Ausweg gefunden. Selbst das programmgesteuerte Hinzufügen einer expliziten Breite/Höhe-Einschränkung zur Bildansicht scheint ignoriert zu werden !? [irgendwelche Ideen?]. Nettoergebnis: Vergewissern Sie sich, dass Ihr Bild zu Beginn die richtige Höhe hat (z. B. etwa 45 Pixel bei einem iPhone 4S). Andernfalls erhalten Sie eine immer größere Lücke zwischen dem Schaltflächenbild und dem Text.

  • Ernsthafter: Sobald Sie der Schaltfläche ein Bild hinzugefügt haben, scheint das UIActionSheet automatisch zu bewirken, dass der Text der Schaltfläche fett (!) Angezeigt wird. Ich weiß nicht warum und weiß nicht, wie ich das verhindern kann [irgendwelche Ideen?] 

  • Schließlich setzt diese Lösung voraus, dass die Unteransichten des UIActionSheet in derselben Reihenfolge liegen, in der die Schaltfläche indiziert ist. Dies gilt für eine Handvoll Schaltflächen, aber (offensichtlich), wenn sich in Ihrem UIActionSheet viele Elemente befinden, die von Apple bei der Indizierung verwendet werden [aber Sie haben sowieso Probleme in actionSheet: clickedButtonAtIndex: wenn Sie versuchen, dies herauszufinden welcher Button wurde angetippt ...]

  • Oh, das imageEdgeInsets: ist optional - Ich füge jedes Bild ein paar Pixel innerhalb der Schaltfläche ein, damit sich die Bilder nicht vertikal berühren.

    [Meinung: Angesichts der obigen Eigenheiten habe ich das Gefühl, dass Apple wirklich nicht will, dass sich die Leute mit ihren Aktionsblättern herumtreiben. Irgendwann müssen Sie wahrscheinlich den Bullen beißen und einfach Ihr eigenes modales Popup implementieren. Es gibt nur so viele Manipulationen, die diese UIActionSheets aufnehmen ...]

1
tiritea

Ab iOS 8.0 können Sie UIAlertController verwenden. In UIAlertController ist jedes Schaltflächenelement als UIAlertAction bekannt und wird entsprechend hinzugefügt.

Sie können meine Antwort überprüfen

0
Jaha Rabari