2015-08-05 16 views
7

Ho una sottoclasse di UIView, e ha aggiunto le touchesBegan e touchesEnd metodi ...touchesBegan con ritardo

In touchesBegan, ho impostato il backgroundColor dal bianco al verde utilizzando self.backgroundColor = [UIColor greenColor] ... nel touchesEnd reimposta il colore al bianco.

Funziona ma molto lentamente. Toccando la vista, ci vogliono 0,5 - 1,0 sec finché non vedo il colore verde.

Selezionare una cella in un UITableView è molto più veloce.

+0

hm, potrebbe essere dovuto ad un'animazione implicita quando si impostano proprietà come colore backGroudn. Puoi controllare se il tocco è in ritardo o solo il cambio di colore? – Volker

+0

Questo UIView dei tuoi è all'interno di UITableView o UIScrollView? –

+2

@Volker Bel modo di pensare, ma 'UIKit' disabilita le animazioni implicite del sottostante' CALayer's ([vedi questa grande risposta qui] (http://stackoverflow.com/questions/4749343/when-exact-do-implicit-animations- take-place-in-ios)), quindi immagino che questo non sia il problema. Cercherei 'delaysContentTouches' di una superview o qualcosa di simile. – Alladinian

risposta

3

Prova questa:

self.view.userInteractionEnabled = YES; 
    UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(doCallMethod:)]; 
    recognizer.delegate = self; 
    recognizer.minimumPressDuration = 0.0; 
    [self.view addGestureRecognizer:recognizer]; 

- (void)doCallMethod:(UILongPressGestureRecognizer*)sender { 
    if(sender.state == UIGestureRecognizerStateBegan){ 
     NSLog(@"Begin"); 
     self.view.backgroundColor = [UIColor greenColor]; 
    }else if (sender.state == UIGestureRecognizerStateEnded){ 
     NSLog(@"End"); 
     self.view.backgroundColor = [UIColor whiteColor]; 
    } 
} 

Nota: che funzionerà più velocemente.

+0

ok questo funziona, ma se metto nuova vista in un UITableViewCell ... i'cant strisciare la cella per vedere la rimozione button :-( – Raegtime

+0

Funziona, ma se la vista è all'interno di una superView di tipo UIScrollView ... ScrollView non può scorrere iniziando lo scroll all'interno della vista con minimumDressDuration = 0.0 ... quindi devi adattare questo valore ad es. 0.1 ... e UIScrollView è in grado di scorrere – Raegtime

+1

perché toccareBegan avrà un ritardo? Comunque ad accelerare? – TomSawyer

2

È consigliabile utilizzare un riconoscitore di gesti come suggerito da TheBurgerShot ma si consiglia uno UILongPressGestureRecognizer. Qualcosa di simile:

UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(changeColor:)]; 
gesture.minimumPressDuration = 0.f; 
[self.yourView addGestureRecognizer:gesture]; 

nel viewDidLoad. E:

-(void) changeColor:(UIGestureRecognizer *)gestureRecognizer{ 

    if (gestureRecognizer.state == UIGestureRecognizerStateBegan){ 
     self.yourView.backgroundColor = [UIColor greenColor]; 
    } 
    else if (gestureRecognizer.state == UIGestureRecognizerStateEnded){ 
     self.yourView.backgroundColor = [UIColor whiteColor]; 
    } 
} 
+0

sai perché touchesbegan ha qualche ritardo? usare il gesto può risolvere il problema ma non può avere tutti gli attributi come touchsbegan come il tocco multiplo. – TomSawyer