2011-11-24 13 views
10

Quiero descartar UIAlertView en cualquier lugar fuera de él con un toque. Quiero mostrar un UIAlertView sin ningún botón.iOS ¿Cómo descartar UIAlertView con un toque en cualquier lugar?

Tengo códigos UIAlertView estándar aquí, pero necesito información sobre cómo descartarlo, si es posible.

¿Con UITouch? Con UITapGestureRecognizer?

Gracias.


EDIT:

en viewDidLoad

alertview inicialización aquí con el nombre de "alerta"

 if (alert) 
    { 
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)]; 
    emptyview.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:emptyview]; 
     [emptyview addSubview:alert]; 
    NSLog (@"emptyview is there!"); 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
     [emptyview addGestureRecognizer:singleTap]; 
     [singleTap release];    
    } 

Pero ésto no emptyview no responde en absoluto y que no responde a la selección de handleSingleTap , que reescribí un poco:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{ 
    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    [emptyview removeFromSuperview]; 
} 

Necesito que esta vista vacía esté en alerta cuando se muestra la alerta, entonces puedo descartar la alerta con un toque.

me trataron:

 if (alert) 
    { 
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)]; 
    emptyview.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:emptyview]; 
     [emptyview addSubview:alert]; 
    NSLog (@"emptyview is there!"); 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
     [alert addGestureRecognizer:singleTap]; 
     [singleTap release];    
    } 

Por supuesto, alerta respondió a la función handleSingleTap. ¿Qué hice mal con la vista vacía?


SEGUNDA EDICIÓN:

Lo que quiero lograr en este caso es mostrar una pequeña vista con la explicación después de seleccionar una palabra, de función similar en aplicación Kindle, si tiene uno. Tal vez debería crear un UIView en lugar de UIAlertView? Pero la pequeña vista en la aplicación Kindle es tan bonita con la sombra debajo de ella, ¿cómo es posible?

Respuesta

10

Suena como que son esencialmente tratando de recrear un "Toast" en IOS. Buenas noticias, alguien ya lo ha hecho. See this project.

Editar: No quiero utilizar iToast. Me gusta tu estilo, menos código es. Aquí es lo que se me ocurrió. Parecería obvio, ya que otros han dicho que la única forma de superar la naturaleza modal del UIAlertView es agregar una supervista para manejar eventos táctiles. Pero no tiene que hacerlo manualmente cada vez, considere la subclasificación UIAlertView. Intentar algo como esto:

Editar: @wagashi, gracias por aceptar mi respuesta, y gracias por el cara a cara sobre setFrame: siendo un buen lugar para ajustar el tamaño.Su código es una pequeña alerta muy tostada, sin embargo, cuando lo probé, descubrí que si el mensaje era demasiado largo, la vista parecía desmoronarse. Así que modifiqué setFrame: para simplemente reducir el tamaño de la alerta aproximadamente del tamaño de un botón y para mantener el foco en la pantalla. Para que la clase responda con precisión el título de pregunta "iOS ¿Cómo descartar UIAlertView con un toque en cualquier lugar?"

NoButtonAlertView.h

#import <UIKit/UIKit.h> 
@interface _NoButtonAlertViewCover : UIView 
@property (nonatomic,assign) UIAlertView *delegate; 
@end 
@interface NoButtonAlertView : UIAlertView 
-(id)initWithTitle:(NSString *)title message:(NSString *)message; 
@end 

NoButtonAlertView.m

#import "NoButtonAlertView.h" 
@implementation _NoButtonAlertViewCover 
@synthesize delegate = _delegate; 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [self removeFromSuperview]; 
    [_delegate dismissWithClickedButtonIndex:0 animated:YES]; 
} 
@end 
@implementation NoButtonAlertView 
-(void)show{ 
    [super show]; 
    _NoButtonAlertViewCover *cover = [[_NoButtonAlertViewCover alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    cover.userInteractionEnabled = YES; 
    cover.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:.01]; 
    cover.delegate = self; 
    [self.superview addSubview:cover]; 
} 
-(id)initWithTitle:(NSString *)title message:(NSString *)message{ 
    if ((self = [super initWithTitle:title message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil])){ 
    } 
    return self; 
} 
- (void)setFrame:(CGRect)rect { 
    // Called multiple times, 4 of those times count, so to reduce height by 40 
    rect.size.height -= 10; 
    self.center = self.superview.center; 
    [super setFrame:rect]; 
} 
@end 

Con este sencillo UIAlertView subclase y su UIView subclase de una cubierta, se puede usar como simplemente como lo haría un estándar UIAlertView. De este modo:

NoButtonAlertView *alert = [[NoButtonAlertView alloc] initWithTitle:@"Hello" message:@"I am the very model of a modern major general; I'm information, vegitable, animal, and mineral."]; 
[alert show]; 

cederá:

Custom AlertView

+1

Um, mi objetivo no es hacer o usar una vista hecha de códigos complicados y largos. Este iToast es realmente genial, pero me pregunto si es posible hacer una función con menos códigos. Gracias por compartir este enlace con nosotros. – wagashi

+0

esto fue inmensamente útil! Agregué en .m: ' - (void) setFrame: (CGRect) rect { \t // [super setFrame: CGRectMake (0, 0, rect.size.width, 300)]; \t \t [super setFrame: CGRectMake (0, 0, 100, 100)]; \t \t // El código siguiente hace que UIAlertView se centre. \t //self.center = CGPointMake (320/2, 480/2); \t \t // mi cgpointmake personalizado \t self.center = CGPointMake (200, 400); } ' – wagashi

+0

Sí, respondiste mi pregunta. Sin embargo, no voy a poner mucha información en mi "alerta", por lo que CGRectMake 0,0,100,100 es perfecto en mi caso. Me pregunto si es posible cambiar el tamaño de fuente del texto dentro de UIAlertView. – wagashi

3

Después de mostrar UIAlertView, agregue a su controlador de vista (o incluso a la ventana) una nueva UIView vacía con pantalla completa. Adjuntar a este Wiew UITapGestureRecognizer

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
[view addGestureRecognizer:singleTap]; 
[singleTap release]; 

Ahora en handleSingleTap método que puede despedir UIAlertView y eliminar esta vista desde la ventana

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{ 
    [myAlert dismissWithClickedButtonIndex:0 animated:YES]; 
    [view removeFromSuperView]; 
} 
+1

me gustaría añadir una costumbre UIButton sin texto o imagen –

+0

Sí, buena idea. Ahorra de escribir varias líneas de código. En cualquier caso, debe manejar la acción de toque. – beryllium

+1

Por curiosidad, ¿por qué utilizar un 'UIAlertView' en absoluto? Coloque un "UIButton" de pantalla completa delante de todas las demás vistas con el texto y el color de fondo w/alpha que desee (u obtenga más elegante). – XJones

Cuestiones relacionadas