2011-11-24 20 views
10

Voglio ignorare UIAlertView ovunque al di fuori con un solo tocco. Voglio mostrare un UIAlertView senza alcun pulsante.iOS Come liquidare UIAlertView con un solo tocco?

Qui ho i codici UIAlertView standard qui, ma ho bisogno di input su come eliminarlo, se è possibile.

Con UITouch? Con UITapGestureRecognizer?

Grazie.


EDIT:

in viewDidLoad

alertview inizializzazione qui con il nome di "alert"

 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];    
    } 

Ma questo emptyview doesnt non risponde a tutti e non risponde alla selezione della handleSingleTap , che ho riscritto un po ':

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

Ho bisogno che questa vista vuota sia in allerta quando viene visualizzato l'avviso, quindi posso eliminare l'avviso con un solo tocco.

ho provato:

 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];    
    } 

Naturalmente, avviso ha risposto alla funzione handleSingleTap. Cosa ho sbagliato con emptyview?


SECONDO EDIT:

Quello che voglio raggiungere in questo caso è quello di mostrare una piccola vista con la spiegazione dopo aver selezionato una parola, funzione simile a Kindle app, se ne hai uno. Forse dovrei creare un UIView invece di UIAlertView? Ma la piccola vista nell'app Kindle è così bella con l'ombra al di sotto di essa, com'è possibile?

risposta

10

Sembra che si sta essenzialmente cercando di ricreare un "Toast" su iOS. Buone notizie, qualcuno l'ha già fatto. See this project.

Modifica: Non voglio utilizzare iToast. Mi piace il tuo stile, meno codice è. Ecco cosa mi viene in mente. Sembrerebbe ovvio come altri hanno affermato che l'unico modo per superare la natura modale dello UIAlertView è aggiungere una superview per gestire gli eventi touch. Ma non devi farlo manualmente ogni volta, prendi in considerazione la sottoclasse UIAlertView. Provare qualcosa di simile:

Edit: @wagashi, grazie per aver accettato la mia risposta, e grazie per il testa a testa su setFrame: essere un buon posto per regolare le dimensioni.Il tuo codice fa un piccolo avvertimento simile a un toast, tuttavia quando ho provato ho scoperto che se il messaggio era troppo lungo la vista sembrava andare in pezzi. Quindi ho modificato setFrame: per ridurre semplicemente la dimensione dell'avviso di circa la dimensione di un pulsante e per rimanere centrato sullo schermo. In modo che la classe risponda con precisione al titolo della domanda "iOS Come liquidare UIAlertView con un solo tocco da qualche parte?"

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 questo semplice UIAlertView sottoclasse e la sua sottoclasse UIView per una copertina, è possibile utilizzarlo come semplice come si farebbe uno standard UIAlertView. In questo 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]; 

produrrà:

Custom AlertView

+1

Il mio obiettivo non è quello di creare o utilizzare una vista fatta di codici complicati e lunghi. Questo iToast è davvero grandioso, ma mi chiedo se sia possibile creare una tale caratteristica con meno codici? Grazie per aver condiviso questo link con noi. – wagashi

+0

questo è stato incommensurabilmente utile! Ho aggiunto in .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 // codice qui sotto rende UIAlertView centrato. \t //self.center = CGPointMake (320/2, 480/2); \t \t // my custom cgpointmake \t self.center = CGPointMake (200, 400); } ' – wagashi

+0

Sì, hai risposto alla mia domanda. Tuttavia non ho intenzione di mettere molte informazioni nel mio "alert", quindi CGRectMake 0,0,100,100 è perfetto nel mio caso. Mi chiedo se è possibile modificare la dimensione del carattere del testo all'interno di UIAlertView? – wagashi

3

Dopo aver visualizzato UIAlertView, aggiungere al proprio controller di visualizzazione (o anche alla finestra) un nuovo UIView vuoto con le dimensioni dello schermo intero. Collegare a questa wiew UITapGestureRecognizer

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

Ora in handleSingleTap metodo è possibile respingere UIAlertView e rimuovere questo vista dalla finestra

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

mi piacerebbe aggiungere una consuetudine UIButton senza testo o immagine –

+0

Sì, buona idea. Salva dalla scrittura di diverse righe di codice. In ogni caso è necessario gestire l'azione di tocco. – beryllium

+1

Per curiosità, perché usare un 'UIAlertView'? Metti a schermo intero 'UIButton' di fronte a tutte le altre viste con qualsiasi testo e colore di sfondo w/alpha ti piaccia (o divertiti). – XJones