Добавление изображений в кнопки UIActionSheet, как в UIDocumentInteractionController - PullRequest
33 голосов
/ 26 мая 2011

Можно ли добавить изображение к кнопкам UIActionSheet, как показано на UIDocumentInteractionController? Если да, пожалуйста, дайте мне знать, как это делается.

image

Ответы [ 12 ]

71 голосов
/ 20 марта 2012

Существует возможность добавлять изображения (а точнее: значки или символы) к кнопкам UIActionSheet (или UIAlertView), не загружая файлы изображений и не переключаясь с (под) представлениями. В этих классах кнопки указываются по их заголовкам, которые являются строками. Таким образом, очевидно, использовать символы, которые можно указывать также строками. Сначала я использовал символы юникода .

Затем я обнаружил, что некоторые из них отображаются в iOS как симпатичные значки и как можно видеть несколько символов в Character Viewer также в Mac OS. Таким образом, символы могут использоваться фактически везде, где может быть указана строка.

Недостатки этого подхода:

  • Вы ограничены предопределенными символами.
  • Не все символы отображаются так, как должны (например, \u29C9).
  • Могут быть изменения в отображении некоторых символов в разных версиях iOS (например, \U0001F533 в iOS 5 и 6).

Вот некоторые интересные символы среди других:

Если вы хотите быстро проверить, как выглядит символ (по крайней мере, в Mac OS), вы можете использовать Калькулятор . Определенно проверьте в симуляторе: например, \u2B1C не является значком в калькуляторе 10.7.1.

Скриншоты:

UIActionSheet

UIActionSheet

Названия кнопок:

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

UIAlertView

enter image description here

Название кнопки:

@"\u26A0 Yes"

UITableViewCell с флажком и другими значками

UITableViewCell

27 голосов
/ 26 мая 2011

Попробуйте, надеюсь, это поможет вам.

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];
6 голосов
/ 26 мая 2011

Стандартный 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
}

Я не уверен, реагирует ли изображение на прикосновения, но вы можете создать UIActionSheet, как UIDocumentInteractionController.

5 голосов
/ 18 июля 2012

Вот один из способов сделать это: https://github.com/levey/LeveyPopListView enter image description here

4 голосов
/ 09 декабря 2015
- (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];

}

3 голосов
/ 04 сентября 2014

Вы можете получить заголовок кнопки действия из объекта 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];
2 голосов
/ 25 февраля 2015

Для 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];
}
2 голосов
/ 19 мая 2013

Я только что создал класс, имитирующий внешний вид 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];

Если у вас возникнут проблемы, пожалуйста, дайте мне знать. Я надеюсь, что это помогает многим людям, имеющим ту же проблему, что и я ...

1 голос
/ 18 декабря 2014
    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 голос
/ 23 августа 2014

Я обнаружил, что это расширение категории работает в 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 могут вместить только столько людей ...]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...