Как настроить UIActionSheet? IOS

Можно ли создать ActionSheet, у которого есть метка между двумя кнопками, подобными этому изображению?

enter image description here

На самом деле это нужно прямо сейчас. Может кто-нибудь мне помочь? Спасибо.

Ответ 1

Это, безусловно, возможно, и мне нравится делать это все время!

Сначала сделайте @property UIActionSheet (в этом примере моя называется aac - это очень удобно, особенно если вы хотите называть ее UITextFields.

Далее, в методе, который вы поднимаете таблицу действий, скажем,   -(IBAction)userPressedButton:(id)sender, создайте локальный экземпляр листа действий.

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

затем добавьте его в свою собственность: self.aac = actionsheet

Теперь у вас есть полное правление, чтобы что-либо сделать в этом ActionSheet, я дам вам сокращенную форму того, что я сделал для недавнего проекта:

- (IBAction)sendDataButtonPressed:(id)sender {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

    self.aac = actionSheet;

    UIImageView *background = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"actionsheet_bg.png"]];
    [background setFrame:CGRectMake(0, 0, 320, 320)];
    background.contentMode = UIViewContentModeScaleToFill;
    [self.aac addSubview:background];

    UIButton *cancelButton = [UIButton buttonWithType: UIButtonTypeCustom];
    cancelButton.frame = CGRectMake(0, 260, 320, 50);
    [cancelButton setBackgroundImage:[UIImage imageNamed:@"actionsheet_button.png"] forState: UIControlStateNormal];
    [cancelButton addTarget:self action:@selector(cancelButtonClicked:)    forControlEvents:UIControlEventTouchUpInside];
    cancelButton.adjustsImageWhenHighlighted = YES;
    [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal];
    [cancelButton setTitleColor:[UIColor colorWithRed:0/255.0f green:177/255.0f blue:148/255.0f alpha:1.0f] forState:UIControlStateNormal];
    cancelButton.titleLabel.textAlignment = NSTextAlignmentCenter;
    cancelButton.titleLabel.font = [UIFont fontWithName: @"SourceSansPro-Light" size: 25];

    [self.aac addSubview: cancelButton];

    UIButton *emailResultsButton = [UIButton buttonWithType: UIButtonTypeCustom];
    emailResultsButton.frame = CGRectMake(25, 12, 232, 25);
    [emailResultsButton addTarget:self action:@selector(emailResultsTapped:) forControlEvents:UIControlEventTouchUpInside];
    emailResultsButton.adjustsImageWhenHighlighted = YES;
    [emailResultsButton setTitle:@"Email Results" forState:UIControlStateNormal];
    [emailResultsButton setTitleColor:[UIColor colorWithRed:255/255.0f green:255/255.0f blue:255/255.0f alpha:1.0f] forState:UIControlStateNormal];
    [emailResultsButton setTitleColor:[UIColor colorWithRed:0/255.0f green:177/255.0f blue:148/255.0f alpha:1.0f] forState:UIControlStateHighlighted];
    emailResultsButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    emailResultsButton.titleLabel.font = [UIFont fontWithName: @"SourceSansPro-Light" size: 20];
    [self.aac addSubview: emailResultsButton];

// lots of other buttons...

// then right at the end you call the showInView method of your actionsheet, and set its counds based at how tall you need the actionsheet to be, as follows:

[self.aac showInView:self.view];
[self.aac setBounds:CGRectMake(0,0,320, 600)];

Вот изображение того, что происходит (помните, что в примере кода я пропустил все остальные кнопки, но они изображены здесь): enter image description here

Теперь, если вы хотите отменить actionSheet - в зависимости от того, как вы настроили структуру своей кнопки, или, возможно, используете UIToolBar (очень часто) - вы можете в действии селектора кнопок сделать следующее:

-(void)cancelButtonClicked:(id)sender { [self.aac dismissWithClickedButtonIndex:0 animated:YES]; }

Кроме того, просто FYI, получив все размеры, подходящие только для вашего макета, потребуется немного времени, так как вы не работаете с видом вашего основного UIView вашего UIViewController, а скорее из вида actionSheet, поэтому он имеет разные размеры.

Один трюк, который я делаю, - это раскладка листа действий в Storyboard с UIView, а затем поместить все объекты, которые вы хотите в своем "рабочем листе" в этом UIView, и вы должны получить точные размеры для всех изображений.

Сообщите мне, если вам нужно разъяснение, удачи!

Ответ 2

https://github.com/xmartlabs/XLActionController позволяет нам создать любой настраиваемый лист действий, обеспечивающий гораздо большую гибкость, чем предлагаемые выше решения.

Вот некоторые примеры, включенные в репозиторий github.

  •   demo_skype.gif   demo_spotify.gif   demo_twitter.gif   demo_tweetbot.gif   demo_periscope.gif   demo_youtube.gif  

Ответ 3

Я просто собирался добавить небольшой комментарий, но я не могу прокомментировать, но так плохо выложил полный ответ. Если вы хотите избежать ошибок IOS7 CGContextSetFillColorWithColor: недопустимый контекст 0x0. Это серьезная ошибка и т.д. Вы можете использовать следующее.

self.actionSheet = [[UIActionSheet alloc] initWithTitle:@""
                                               delegate:nil
                                      cancelButtonTitle:nil
                                 destructiveButtonTitle:nil
                                      otherButtonTitles:nil];

Однако это испортит графику/рисунок вверху вашего листа действий, так как @Max сказал, что если у вас уже нет фона, добавление просто добавляет этот код, чтобы дать вам представление по умолчанию.

UIView *background = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
background.backgroundColor = [UIColor colorWithRed:204.0/255.0 green:204.0/255.0 blue:204.0/255.0 alpha:1];
[self.actionSheet addSubview:background];

затем добавьте все, что вы хотите, в свой собственный лист действий.

Ответ 4

Если вы не хотите использовать хаки в UIActionSheet для его настройки, вы можете проверить замену для UIActionSheet, которую я сделал: https://github.com/JonasGessner/JGActionSheet Он полностью настраиваемый!

Ответ 5

UIButton* button = (UIButton*)sender;
    actionSheet = [[UIActionSheet alloc] initWithTitle:@"Share the PNR Status" delegate:self
                                     cancelButtonTitle:@"Cancel"
                                destructiveButtonTitle:nil
                                     otherButtonTitles:@"Send Message",@"Send Email",@"Facebook",nil];

    [[[actionSheet valueForKey:@"_buttons"] objectAtIndex:0] setImage:[UIImage imageNamed:@"chat.png"] forState:UIControlStateNormal];
    [[[actionSheet valueForKey:@"_buttons"] objectAtIndex:1] setImage:[UIImage imageNamed:@"email.png"] forState:UIControlStateNormal];
    [[[actionSheet valueForKey:@"_buttons"] objectAtIndex:2] setImage:[UIImage imageNamed:@"facebook_black.png"] forState:UIControlStateNormal];
 //*********** Cancel
    [[[actionSheet valueForKey:@"_buttons"] objectAtIndex:3] setImage:[UIImage imageNamed:@"cancel.png"] forState:UIControlStateNormal];
    [actionSheet showFromRect:button.frame inView:self.view animated:YES];

Ответ 6

Если вам нравится стиль Google и вам нужна легкая библиотека, вы можете посмотреть на это: https://github.com/ntnhon/MaterialActionSheetController

Это полностью настраиваемый.

введите описание изображения здесь