ios - objective - uialertcontroller styles
UIAlertView addSubview en iOS7 (8)
Agregar algunos controles a UIAlertView
quedó obsoleto en iOS7 usando el método addSubview
. Como sé, Apple prometió agregar la propiedad contentView
.
iOS 7 se lanzó ahora y veo que esta propiedad no se agrega. Es por eso que busco alguna solución personalizada con la capacidad de agregar una barra de progreso a este alertView. Algo similar, por ejemplo, a TSAlertView , pero más listo para usar en iOS 7 .
Escribí una implementación completa de UIAlertView que imita la API completa de UIAlertView, pero agrega la propiedad contentView que todos hemos deseado durante tanto tiempo: SDCAlertView .
Me llevó solo 1 día crear mi propia vista de alerta que se parece exactamente a la de Apple
- Tome una captura de pantalla de la alerta de Apple para referencia (tamaños de fuente, espacios, ancho)
- Cree un xib con título, mensaje, vista personalizada y tablas para botones (Apple usa tablas en lugar de
UIButton
ahora, la celda de tabla predeterminada es lo suficientemente buena). Tenga en cuenta que necesita 3 tablas de botones: dos para los botones izquierdo y derecho (siempre que el número de botones sea 2), otro para los otros casos (un botón o más de 2 botones). Implemente todos los métodos de
UIAlertView
en su alerta personalizada.Mostrar / Descartar: puede crear una ventana modal específica para sus alertas, pero solo coloco mis alertas sobre mi controlador de vista raíz. Registre sus alertas visibles en una matriz estática. Si muestra la primera alerta / descartando la última, cambie el modo de tinte de su controlador de ventana / vista a atenuado / a automático y agregue / elimine una vista de atenuación (negro con alfa = 0.2).
- Fondo borroso: use el código de muestra de Apple (utilicé blanco opaco)
- Efectos dinámicos en 3D: use el código de muestra de Apple (5 líneas de código). Si desea un efecto agradable, tome una instantánea un poco más grande en el paso 5 y agregue animadores inversos para el fondo de alerta y el primer plano.
EDITAR:
Tanto el fondo borroso como el código de muestra del efecto paralax se pueden encontrar en el código de ejemplo WWDC 2013 "iOS_RunningWithASnap"
Efecto Paralax:
UIInterpolatingMotionEffect* xAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x"
type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis] autorelease];
xAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
xAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];
UIInterpolatingMotionEffect* yAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y"
type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis] autorelease];
yAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
yAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];
UIMotionEffectGroup *group = [[[UIMotionEffectGroup alloc] init] autorelease];
group.motionEffects = @[xAxis, yAxis];
[self addMotionEffect:group];
El fondo borroso es lo único complicado. Si puede usar un color opaco en su lugar, úselo. De lo contrario, es una gran cantidad de experimentación. También tenga en cuenta que el fondo borroso no es una buena solución cuando el fondo es oscuro.
Para show / dismiss animationg, estoy usando el nuevo método de animación de primavera:
void (^animations)() = ^{
self.alpha = 1.0f;
self.transform = CGAffineTransformIdentity;
};
self.alpha = 0.0f;
self.transform = CGAffineTransformMakeScale(0.5f, 0.5f);
[UIView animateWithDuration:0.3
delay:0.0
usingSpringWithDamping:0.7f
initialSpringVelocity:0.0f
options:UIViewAnimationOptionCurveLinear
animations:animations
completion:^(BOOL completed) {
//calling UIAlertViewDelegate method
}];
No habrá UIAlertView
con vistas personalizadas en iOS7, ni contentView
que Apple cambió de parecer, por lo que addSubview
ahora es imposible en UIAlertView
.
Una buena alternativa será SVProgressHUD , de acuerdo con muchos hilos en el foro de Apple.
Editar :
Oficialmente no hay addSubview
ni subclases para UIAlertView
en iOS7 .
La clase UIAlertView está pensada para ser utilizada tal como está y no es compatible con la creación de subclases. La jerarquía de vista para esta clase es privada y no debe modificarse.
Otras buenas alternativas
PKAlertController ( https://github.com/goodpatch/PKAlertController ) es una gran biblioteca. Probé muchas bibliotecas similares y esto satisfizo todos mis requisitos.
Por qué es genial:
- Admite vistas personalizadas
- Admite iOS7
- Es controlador de vista
- Se comporta y se parece a la vista de alerta nativa, incluidos los efectos de movimiento
- Personalizable
- Interfaz similar como en UIAlertController
Para IOS7
UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"Enter Form Name"
message:@""
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Ok", nil];
alertView1.alertViewStyle = UIAlertViewStyleSecureTextInput;
UITextField *myTextField = [alertView1 textFieldAtIndex:0];
[alertView1 setTag:555];
myTextField.keyboardType=UIKeyboardTypeAlphabet;
[alertView1 show];
Para aquellos que aman los métodos simples y efectivos sin tener que escribir líneas de código. Aquí hay una solución genial sin utilizar ningún otro trabajo de marco privado para agregar subvistas a ios 7 vistas de alerta, es decir,
[alertView setValue: imageView forKey: @ "accessoryView"];
Código de muestra para una mejor comprensión,
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(180, 10, 85, 50)];
UIImage *wonImage = [UIImage imageNamed:@"image.png"];
[imageView setImage:wonImage];
//check if os version is 7 or above
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
[alertView setValue:imageView forKey:@"accessoryView"];
}else{
[alertView addSubview:imageView];
}
Espero que ayude a alguien, gracias :)
Puede encontrar una solución simple sin clases adicionales here
Se basa en la configuración de accesorios para el UIAlertView ordinario.
Aquí hay un proyecto en Github para agregar cualquier UIView a un diálogo de UIAlertView en iOS7.
(Copiado de este hilo .)