È necessario elaborare i tocchi nella panoramica anziché nella visualizzazione che si desidera disattivare. Questo ti permetterà di cambiare la vista senza perdere i tuoi eventi touch. Tuttavia, quando esegui questa operazione, dovrai verificare se il tocco si sta verificando nella visualizzazione secondaria specifica che desideri disattivare. Questo può essere fatto molti modi, ma qui ci sono alcuni metodi per iniziare:
Conversione Rect/Punto a un'altra visualizzazione:
[view convertRect:rect toView:subview];
[view convertPoint:point toView:subview];
Ecco alcuni metodi per testare se il punto si trova nella vista :
[subView hitTest:point withEvent:nil];
CGRectContainsPoint(subview.frame, point); //No point conversion needed
[subView pointInside:point withEvent:nil];
In generale, è preferibile utilizzare UIGestureRecognizers. Ad esempio, se si stesse utilizzando un UIPanGestureRecognizer, si creerebbe un metodo che il riconoscitore di gesti può chiamare e in quel metodo si esegue il proprio lavoro. Per esempio:
- (void) viewPanned:(UIPanGestureRecognizer *)pan{
if (pan.state == UIGestureRecognizerStateBegan){
CGRect rect = subView.frame;
newView = [[UIView alloc] initWithFrame:rect];
[subView removeFromSuperview];
[self addSubview:newView];
} else if (pan.state == UIGestureRecognizerStateChanged){
CGPoint point = [pan locationInView:self];
newView.center = point;
} else {
//Do cleanup or final view placement
}
}
Poi init il sistema di riconoscimento, assegnato alla destinazione (di solito auto) e aggiunge:
[self addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(viewPanned:)]];
Ora sé (che sarebbe il superview gestione è subviews) risponderà per fare una panoramica dei movimenti.
fonte
2012-04-05 15:24:19
Non so perché sarebbe. Puoi pubblicare il codice? A proposito, cosa ti impedisce di usare un UIGestureRecognizer? In quasi tutti i casi in cui ho preso in considerazione l'utilizzo di Touches, ho scoperto che sia UIGestureRecognizer sia la sottoclasse UIGestureRecognizer funzionano meglio (e posso riutilizzarli). –
Se stai usando lo stock UIPanGestureRecognizer, 'touchesBegan' non dovrebbe essere nel tuo codice. Dovresti impostare un metodo di destinazione come questo: '- (void) viewPanned: (UIPanGestureRecognizer) pan'. Quando si avvia il riconoscimento, si imposta la sua destinazione: '[[UIPanGestureRecognizer alloc] initWithTarget: self action: @selector (viewPanned :)]'.Questo metodo verrà chiamato ripetutamente e potrai controllare lo stato ed eseguire le azioni appropriate: 'If (pan.state == UIGestureRecognizerStateBegan) {.......}' o 'If (pan.state == UIGestureRecognizerStateChanged {. ....} 'etc ... –
Ho espanso la mia risposta per rispecchiare questo –