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.
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];
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:
\u29C9
).\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
Schaltflächentitel:
@"\U0001F6A9 \U0001F4CC \u26F3 \u2690 \u2691 \u274F \u25A4 Test"
@"\U0001F4D6 \U0001F30E \U0001F30F \u25A6 \U0001F3C1 \U0001F332 \U0001F333 \U0001F334 Test"
UIAlertView
Button-Titel:
@"\u26A0 Yes"
UITableViewCell
mit Kontrollkästchen und anderen Symbolen
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.
Gehen Sie folgendermaßen vor: 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];
}
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];
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 ...
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];
}
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];
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];
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 ...]
Ab iOS 8.0 können Sie UIAlertController
verwenden. In UIAlertController
ist jedes Schaltflächenelement als UIAlertAction
bekannt und wird entsprechend hinzugefügt.