2015-08-21 18 views
6

Ho un UIView, che appare quando si preme un pulsante, lo sto usando come visualizzazione di avviso personalizzata essenzialmente. Ora, quando l'utente tocca fuori l'UIView personalizzato che ho aggiunto alla vista principale, voglio nascondere la vista del cliente, posso farlo facilmente con customView.hidden = YES; ma come posso controllare il tocco fuori dalla vista?Rimuovi la vista quando si tocca all'esterno

Grazie per l'aiuto

risposta

1

Quando si presenta vista avviso personalizzato, aggiungono che vista avviso personalizzato in un altro visualizzazione a schermo intero, fanno si che vista libera impostando il suo backgroundColor chiaro. Aggiungi la visualizzazione a schermo intero nella vista principale e aggiungi tapGesture nella vista invisibile a schermo intero, quando mai tocca tocca questa vista.

Ma se si farà questo sarà respingere vista anche quando si tocca vista avviso personalizzato per questo è necessario impostare delegato del tapGesture e implementare questo metodo

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view isDescendantOfView:self.customAlertView]) 
    { 
     return NO; 
    } 
    return YES; 
} 
5

Ci sono 2 approcci:

primo approccio:

È possibile impostare un tag per la visualizzazione personalizzata:

customview.tag=99; 

Una allora nella vostra viewcontroller, utilizzare il touchesBegan:withEvent: delegato

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 


    UITouch *touch = [touches anyObject]; 

    if(touch.view.tag!=99){ 
     customview.hidden=YES; 
    } 

} 

Secondo approccio:

E 'più probabile che ogni volta che si desidera popup una visualizzazione personalizzata, c'è una sovrapposizione alle spalle, che riempirà la vostra schermo (es una vista nera con alfa ~ 0.4). In questi casi, puoi aggiungere un UITapGestureRecognizer e aggiungerlo alla tua visualizzazione ogni volta che vuoi che venga visualizzata la tua visualizzazione personalizzata. Ecco un esempio:

UIView *overlay; 

-(void)addOverlay{ 
     overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, self.view.frame.size.height)]; 
    [overlay setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]]; 

    UITapGestureRecognizer *overlayTap = 
    [[UITapGestureRecognizer alloc] initWithTarget:self 
             action:@selector(onOverlayTapped)]; 

    [overlay addGestureRecognizer:overlayTap]; 



    [self.view addSubview:overlay]; 


} 


- (void)onOverlayTapped 
{ 
    NSLog(@"Overlay tapped"); 
    //Animate the hide effect, you can also simply use customview.hidden=YES; 
    [UIView animateWithDuration:0.2f animations:^{ 
     overlay.alpha=0; 
     customview.alpha=0; 

    }completion:^(BOOL finished) { 
     [overlay removeFromSuperview]; 

    }]; 

} 
+0

suggerirei il primo approccio, piuttosto che usare un controllo non necessario (UITapGestureRecognizer). E soprattutto "Meno codice, più stabile l'app" – DHEERAJ

+0

In questa risposta si lavora al primo approccio sul mio progetto. Ne condividerò la versione veloce –

0

Mi è piaciuto utilizzando la libreria KLCPopuo (facilmente reperibili su GitHub), si fa tutto per te.

Gli dai una vista, la visualizzerà, la animerà, la chiuderà e altri ancora. Cercare e usarlo :)

Se non si desidera, è possibile esaminare la sottoclasse di UIAlertController per adattarlo alle proprie esigenze di avviso precise.

1

con l'uso della funzione pointInside a Swift:

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 

    if let view = customView { 
     //if UIView is open open 
     let newPoint = self.convertPoint(point, toView: view) 
     let pointIsInsideGenius = view.pointInside(newPoint, withEvent: event) 
     // tapping inside of UIView 
     if pointIsInsideGenius { 
      return true 
     } else { 
     // if tapped outside then remove UIView 
       view.removeFromSuperview() 
       view = nil 
      } 
     } 
    } 

    return false 
} 
0

come nella risposta di FlySoFast, ho cercato primo approccio e ha funzionato ho condiviso alla versione rapida di esso. È possibile contrassegnare del proprio visualizzazione personalizzata e controllare la visualizzazione che ha toccato o non così abbiamo raggiunto la nostra soluzione che guess.In l'assegno sotto tag valore della mia visualizzazione personalizzata a 900.

customview.tag = 900 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
      let touch = touches.first! 
      if touch.view?.tag != 900 { 
       resetMenu() 
      } 

    } 

Spero che questa risposta ti aiuterà

Problemi correlati