objective c - ¿Cómo personalizar UIActionSheet? iOS
objective-c (7)
¿Es posible crear una ActionSheet
que tenga una etiqueta entre dos botones como esta imagen?
Realmente necesito esto ahora mismo. ¿Alguien puede ayudarme? Gracias.
Sólo iba a agregar un pequeño comentario, pero no puedo hacer ningún comentario, así que publicaré una respuesta completa. Si desea evitar los errores de IOS7 CGContextSetFillColorWithColor: contexto 0x0 no válido. Este es un error grave, etc. Puede usar lo siguiente.
self.actionSheet = [[UIActionSheet alloc] initWithTitle:@""
delegate:nil
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
Sin embargo, eso estropeará el gráfico / dibujo en la parte superior de su hoja de acción, como lo dijo @Max, por lo que si aún no tiene un fondo que está agregando, simplemente agregue este código para darle el aspecto de la hoja de acción predeterminada.
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];
a continuación, agregue lo que desee a su hoja de acción personalizada.
Si aún estás luchando con esto, quizás esta biblioteca te pueda ayudar: https://github.com/danielsaidi/Sheeeeeeeeet
Está escrito en Swift y te permite crear hojas de acción personalizadas. Tiene soporte incorporado para muchos artículos diferentes y puede ampliarse y rediseñarse.
Si le gusta el estilo de Google y desea una biblioteca liviana, puede echar un vistazo a esto: https://github.com/ntnhon/MaterialActionSheetController
Es totalmente personalizable.
Si no desea utilizar ningún hacks en UIActionSheet para personalizarlo, puede revisar un reemplazo para UIActionSheet que hice: https://github.com/JonasGessner/JGActionSheet Es completamente personalizable!
https://github.com/xmartlabs/XLActionController nos permite crear cualquier hoja de acción personalizada que ofrezca mucha más flexibilidad que las soluciones propuestas anteriormente.
Estos son algunos ejemplos incluidos en el repositorio github.
EDITAR 2018
Publiqué este código en iOS4 cuando era potencialmente útil. El desarrollo de iOS ha crecido de manera asombrosa desde entonces, ¡no uses este código a menos que estés escribiendo una aplicación para iOS4 por cualquier motivo! ¡Por favor, consulte la maravillosa Controladora de Acción XLR de la biblioteca de terceros para sus necesidades de hojas de acción!
¡Es ciertamente posible, y me gusta hacer esto todo el tiempo!
Primero, haga una @property
de un UIActionSheet
(en este ejemplo, el mío se llama aac
, esto es útil especialmente si desea llamarlo por UITextFields
.
A continuación, en el método que -(IBAction)userPressedButton:(id)sender
, diga un -(IBAction)userPressedButton:(id)sender
, cree una instancia local de la -(IBAction)userPressedButton:(id)sender
.
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
Luego self.aac = actionsheet
a tu propiedad: self.aac = actionsheet
Ahora, básicamente, tienes todo el reinado para hacer algo en esta Hoja de Acción, te daré una forma abreviada de lo que hice para un proyecto reciente:
- (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)];
Aquí hay una imagen de lo que sucede (recuerde que omití todos los otros botones en el ejemplo de código, pero se muestran aquí):
Ahora, si desea descartar la ActionSheet (dependiendo de cómo configure la estructura de su botón, o quizás use una Barra de herramientas) (muy común), puede hacerlo en la acción de selección del botón, haga lo siguiente:
-(void)cancelButtonClicked:(id)sender { [self.aac dismissWithClickedButtonIndex:0 animated:YES]; }
Además, solo para su información, obtener todas las dimensiones adecuadas para su diseño tomará un poco de tiempo, ya que no está trabajando con la vista de su UIView principal de su UIViewController, en lugar de la vista de la ActionSheet, por lo que tiene diferentes dimensiones.
Un truco que hago es diseñar la hoja de acciones en el Guión gráfico con una vista UIV, luego colocar todos los objetos que desee en su "hoja de acciones" en esa vista UIV, y debe obtener las dimensiones precisas de todas las imágenes.
Déjame saber si necesitas una aclaración, buena suerte!
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];