2015-08-05 15 views
7

Mam podklasa UIView i dodał touchesBegan i touchesEnd metod ...touchesBegan z opóźnieniem

W touchesBegan, ustawić backgroundColor z białego na zielony używając self.backgroundColor = [UIColor greenColor] ... w touchesEnd zresetować kolor do białego.

Działa, ale bardzo wolno. Stuknięcie w ten widok zajmuje 0,5 - 1,0 sekundy, dopóki nie zobaczę zielonego koloru.

Wybór komórki w UITableView jest znacznie szybszy.

+0

hm, może wynikać z niejawnej animacji podczas ustawiania właściwości, takich jak kolor backGroudn. Czy możesz sprawdzić, czy dotyk jest spóźniony, czy tylko zmiana koloru? – Volker

+0

Ten UIView twój zdarza się być wewnątrz UITableView lub UIScrollView? –

+2

@Volker Ładne myślenie, ale 'UIKit' wyłącza ukryte animacje leżące u podstaw' CALayer's ([zobacz tę wspaniałą odpowiedź tutaj] (http://stackoverflow.com/questions/4749343/when-exactly-do-implicit-animations- take-place-in-ios)), więc domyślam się, że to nie jest problem. Szukałbym 'opóźnieniaContentTouches' z superview lub czegoś podobnego. – Alladinian

Odpowiedz

3

Spróbuj tego:

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

Uwaga: To będzie pracować szybciej.

+0

ok to działa, ale jeśli mam nowy widok w UITableViewCell ... i'cant przesuń komórkę, aby zobaczyć usunąć button :-( – Raegtime

+0

Działa, ale jeśli widok znajduje się wewnątrz superView rodzaju UIScrollView ... ScrollView nie może przewijać przez rozpoczęcie przewijania wewnątrz widoku z minimumDressDuration = 0.0 ... więc musisz dostosować tę wartość do np. 0.1 ... a UIScrollView jest w stanie przewinąć – Raegtime

+1

, dlaczego dotknięcie Begana ma opóźnienie? Mimo to przyspieszyć? – TomSawyer

2

Powinieneś używać funkcji rozpoznawania gestów jako sugerowanej przez TheBurgerShot, ale polecam Ci UILongPressGestureRecognizer. Coś jak:

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

w swoim viewDidLoad. Oraz:

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

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

czy wiesz dlaczego touchesbegan ma pewne opóźnienie? gest użycia może rozwiązać problem, ale nie może mieć wszystkich atrybutów, takich jak touchbegan jak wiele dotknięć. – TomSawyer

Powiązane problemy