Можно ли добавить изображение к кнопкам UIActionSheet
, как показано в UIDocumentInteractionController
? Если да, сообщите мне, как это делается.
Можно ли добавить изображение к кнопкам UIActionSheet
, как показано в 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
) без загрузки файлов изображений или прокручивать (под) представления. В этих классах кнопки обозначаются их названиями, которые являются строками. Поэтому очевидно использовать символы, которые можно указать также строками. Первый, с которым я столкнулся, использовал символы unicode.
Затем я обнаружил, что некоторые из них отображаются как приятные значки на iOS, и как можно увидеть несколько символов в Просмотр символов на Mac OS тоже. Таким образом, символы могут использоваться практически везде, где может быть указана строка.
Недостатками этого подхода являются:
\u29C9
).\U0001F533
на iOS 5 и 6).Вот некоторые интересные символы среди других:
Если вы хотите быстро проверить, как выглядит символ (по крайней мере, в Mac OS), вы можете использовать калькулятор. Проверьте, действительно ли в симуляторе: Например \u2B1C
не является значком в Калькуляторе 10.7.1.
Скриншоты:
UIActionSheet
Названия кнопок:
@"\U0001F6A9 \U0001F4CC \u26F3 \u2690 \u2691 \u274F \u25A4 Test"
@"\U0001F4D6 \U0001F30E \U0001F30F \u25A6 \U0001F3C1 \U0001F332 \U0001F333 \U0001F334 Test"
UIAlertView
Название кнопки:
@"\u26A0 Yes"
UITableViewCell
с флажком и другими значками
Стандартный UIActionSheet не поддерживает изображения.
Одним из способов добавления изображения в UIActionSheet
является добавление subview к UIActionSheet
. Просто реализуйте метод UIActionSheetDelegate
willPresentActionSheet: вот так:
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
UIImageView* buttonImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picturename.png"]];
// Set the frame of the ImageView that it over the button.
[actionSheet addSubview:buttonImage];
[buttonImage release]; // only if you don't need this anymore
}
Я не уверен, что изображение реагирует на касания, но вы можете построить UIActionSheet
как UIDocumentInteractionController
.
Вот один из способов сделать это: https://github.com/levey/LeveyPopListView
Вы можете получить название кнопки действия из объекта actionSheet с помощью клавиши " _buttons" и установить изображение кнопки.
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];
}
Я просто создал класс, эмулирующий внешний вид UIActionSheet, используя ячейки таблицы, поддерживающие изображения и текст для каждой строки. Он также использует блоки для взаимодействия, поддерживает iPhone и iPad, всплывает из UITabBarItem на iPad и создает очередность нескольких листов. Все еще в разработке, но не стесняйтесь клонировать его из 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, чтобы добавить изображение/значок к кнопкам в файле UIActionSheet с некоторыми оговорками...
@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 правильно настроит ваше изображение на нужную высоту для кнопки, похоже, что он не изменяет ширину изображения; поэтому необходимо, чтобы UIViewContentModeScaleAspectFit предотвращал сглаживание изображения. Тем не менее, ширина рамки просмотра изображения по-прежнему является оригинальной полноразмерной, поэтому, если ваше изображение было большим (точнее, широким), вы получите раздражающий промежуток между центрированным (сжатым) изображением и текстом кнопки. Я не нашел пути вокруг этого; даже программно добавляя явное ограничение width = height к представлению изображения, кажется, игнорируется!? [есть идеи?]. Чистый результат, убедитесь, что ваше изображение находится примерно в правильной высоте (например, около 45 пикселей на iPhone 4S), или вы получите больший разрыв между изображением кнопки и текстом.
Более серьезно, как только вы добавляете изображение к кнопке, UIActionSheet, кажется, автоматически вызывает текст кнопки полужирный (!). Я не знаю почему и не знаю, как предотвратить это [любые идеи?]
Наконец, это решение зависит от того, что подпрограммы UIActionSheet должны быть в том же порядке, что и кнопка индексируется. Это справедливо для нескольких кнопок, но (по умолчанию), когда у вас много элементов в вашем UIActionSheet. Apple галопы с индексированием [но у вас будут проблемы с этим в любом случае в ActionSheet: clickedButtonAtIndex: когда вы пытаетесь выяснить какая кнопка была нажата...]
О, imageEdgeInsets: необязательно - я вставляю каждое изображение в пару пикселей внутри кнопки, чтобы изображения не касались друг друга вертикально.
[Мнение: учитывая приведенные выше странности, я чувствую, что Apple действительно не хочет, чтобы люди сбрасывали свои действия. В какой-то момент вам, вероятно, придется укусить пулю и просто реализовать свое собственное модальное всплывающее окно; там будет так много манипулирования этими таблицами 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
каждый элемент кнопки известен как UIAlertAction
который добавляется соответствующим образом.