Можно ли создать ActionSheet
, у которого есть метка между двумя кнопками, подобными этому изображению?
На самом деле это нужно прямо сейчас. Может кто-нибудь мне помочь? Спасибо.
Можно ли создать ActionSheet
, у которого есть метка между двумя кнопками, подобными этому изображению?
На самом деле это нужно прямо сейчас. Может кто-нибудь мне помочь? Спасибо.
Это, безусловно, возможно, и мне нравится делать это все время!
Сначала сделайте @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)];
Вот изображение того, что происходит (помните, что в примере кода я пропустил все остальные кнопки, но они изображены здесь):
Теперь, если вы хотите отменить actionSheet - в зависимости от того, как вы настроили структуру своей кнопки, или, возможно, используете UIToolBar (очень часто) - вы можете в действии селектора кнопок сделать следующее:
-(void)cancelButtonClicked:(id)sender {
[self.aac dismissWithClickedButtonIndex:0 animated:YES];
}
Кроме того, просто FYI, получив все размеры, подходящие только для вашего макета, потребуется немного времени, так как вы не работаете с видом вашего основного UIView вашего UIViewController, а скорее из вида actionSheet, поэтому он имеет разные размеры.
Один трюк, который я делаю, - это раскладка листа действий в Storyboard с UIView, а затем поместить все объекты, которые вы хотите в своем "рабочем листе" в этом UIView, и вы должны получить точные размеры для всех изображений.
Сообщите мне, если вам нужно разъяснение, удачи!
https://github.com/xmartlabs/XLActionController позволяет нам создать любой настраиваемый лист действий, обеспечивающий гораздо большую гибкость, чем предлагаемые выше решения.
Вот некоторые примеры, включенные в репозиторий github.
Я просто собирался добавить небольшой комментарий, но я не могу прокомментировать, но так плохо выложил полный ответ. Если вы хотите избежать ошибок 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];
затем добавьте все, что вы хотите, в свой собственный лист действий.
Если вы не хотите использовать хаки в UIActionSheet для его настройки, вы можете проверить замену для UIActionSheet, которую я сделал: https://github.com/JonasGessner/JGActionSheet Он полностью настраиваемый!
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];
Если вам нравится стиль Google и вам нужна легкая библиотека, вы можете посмотреть на это: https://github.com/ntnhon/MaterialActionSheetController
Это полностью настраиваемый.