像在UIDocumentInteractionController中一样添加图像到UIActionSheetbutton

是否有可能添加一个图像的UIActionSheet的button在UIDocumentInteractionController看到? 如果是这样,请让我知道它是如何完成的。

试试这个方法,我希望它可以帮助你。

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

可以在UIActionSheet (或UIAlertView )的button上添加图像(确切地说是图标或符号),而不用加载图像文件或者(子)视图。 在这些类中,button由其标题指定,即string。 所以使用符号是显而易见的,也可以通过string来指定符号。 我想到的第一个是使用Unicode符号

然后,我发现其中的一些在iOS上呈现为漂亮的图标,而且在Mac OS上的字符查看器中也可以看到几个符号。 因此,符号实际上可以在任何可以指定string的地方使用。

这种方法的缺点是:

  • 您仅限于预定义的符号。
  • 不是所有的符号都应该呈现(例如\u29C9 )。
  • 不同iOS版本的某些符号的外观可能会有所不同(例如iOS 5和6上的\U0001F533 )。

这里有一些有趣的符号:

  • 杂项符号和象形文字
  • 杂项符号
  • 运输和地图符号
  • 装饰符号

如果您想要快速检查符号的外观(至less在Mac OS上),则可以使用计算器 。 在模拟器中确定检查:例如\u2B1C不是计算器10.7.1中的图标。

截图:

UIActionSheet

UIActionSheet

button标题:

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

UIAlertView

在这里输入图像说明

button标题:

 @"\u26A0 Yes" 

带有checkbox和其他图标的UITableViewCell

的UITableViewCell

标准UIActionSheet不支持图像。

将图像添加到UIActionSheet一种方法是将子视图添加到UIActionSheet 。 只需实现UIActionSheetDelegate方法willPresentActionSheet:像这样:

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

我不确定图像是否响应触摸,但是可以像UIDocumentInteractionController一样构build一个UIActionSheet

这是一个方法来做到这一点: https : //github.com/levey/LeveyPopListView 在这里输入图像说明

您可以通过按键“ _buttons ”从actionSheet对象中获取操作button标题并设置button图像。

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

}

我刚刚创build了一个类,使用支持每行的图像和文本的表格单元格来模拟UIActionSheet的外观。 它还使用块进行交互,支持iPhone和iPad,从iPad上的UITabBarItempopup,并排队多张。 仍在开发中,但随时从Github克隆它:

http://github.com/azplanlos/SIActionSheet

用法很简单,下面是一个例子:

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

如果您遇到任何问题,请告诉我。 我希望这可以帮助很多像我一样的问题的人…

对于iOS 8,请参阅此

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

我知道这是很晚的答案,但我发现另一种方式来显示在行动表中的形象:

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

我发现这个类别的扩展工程在ios7.1中添加一个图像/图标的UIActionSheetbutton,有一些注意事项…

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

并使用它:

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

注意事项:

  • 虽然UIActionSheet不会正确地将图像自动调整到button的正确高度 ,但它不会相应地改变图像视图宽度 ; 因此需要UIViewContentModeScaleAspectFit来防止图像被挤压。 但是,imageview框架的宽度仍然是原始的全尺寸,所以如果你的图片很大(或者更精确的话),那么你会在中心(缩小的)图片和button文本之间产生一个烦人的差距。 我找不到解决办法 甚至以编程方式为imageview添加显式宽度=高度约束似乎被忽略! [有任何想法吗?]。 净结果,确保你的图像是从正确的高度开始(例如,iPhone 4S约45像素),否则你会得到一个越来越大的button图像和文字之间的差距。

  • 更严重的是,只要将图像添加到button,UIActionSheet似乎自动使button的文本加粗 (!)。 我不知道为什么,也不知道如何防止这个[任何想法?]

  • 最后,这个解决scheme依赖于UIActionSheet的子视图与button索引相同的顺序。 对于一些button来说,这是正确的,但是当你在UIActionSheet中有很多项目的时候(比如说),苹果会用索引来消化它们[但是在actionSheet中你会遇到这个问题:clickedButtonAtIndex:当你试图找出哪个button被挖掘…]

  • 哦,imageEdgeInsets:是可选的 – 我插入每个图像在button内的几个像素,以便图像不垂直接触彼此。

    [意见:考虑到上述古怪,我感觉苹果真的不希望人们用他们的行动表来诋毁。 在某些时候,你可能不得不咬牙切齿,只实现你自己的模式popup窗口; 只有这么多人处理这些UIActionSheets将容纳…]

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

    从iOS 8.0可以使用UIAlertController。 在UIAlertController中,每个button项都被称为UIAlertAction,并相应地添加。

    你可以检查我的答案