2016-08-20 5 views
-1

Für meine benutzerdefinierte UIView habe ich touchesBegan Methode überschrieben. Was ich ihm gesagt habe ist, seine Hintergrundfarbe zu ändern:iOS Layer Farbwechsel

dispatch_async(dispatch_get_main_queue()){ 
    self.layer.backgroundColor = clr_someCGColor 
} 

Es wirkt komisch. Wenn ich schnell auf die Ansicht tippe, während ich in Landscape alles perfekt mache, aber wenn ich das in Portrait mache, muss ich es für einige Zeit halten, um das Ergebnis zu sehen, aber die touchesEnded Methode wird sofort aufgerufen, wenn ich schnell tippe. Was könnte der Grund sein, die Verspätung in Portrait zu verursachen?

Antwort

1

Entfernen Sie den dispatch_async Wrapper. Alles was es tut, ist eine Verzögerung (wir können nicht auf dem Haupt-Thread ausführen, bis, wie Sie richtig sagen, der Tap endet und touchesEnded ist gekommen und gegangen). Sie sind bereits auf dem Hauptfaden, in touchesBegan, so dass es keine Notwendigkeit für diese zusätzliche Verzögerung gibt.

Noch besser, verwenden Sie einen Tipp Gestenerkennung.

+0

Ich habe es in "dispatch_async" Wrapper, nachdem ich das erste Mal das Problem erlebt und es wieder zu entfernen half nicht. 'UITapGestureRecognizer' gibt nicht die volle Kontrolle über Berührungsereignisse, die ich brauche, um das bg des Layers auf' clr_active' und dann zurück auf 'clr_normal' zu setzen, nachdem die Berührung beendet wurde. – EBDOKUM

+0

Das ist in Ordnung. Aber das 'dispatch_async' hilft dir hier nicht. Ich habe eine App, wo ich das gleiche mache: Ich habe einen Tap-Gesten-Erkenner, aber ich möchte auch zwischen aktivem und inaktivem Look wechseln, während der Finger unten ist, also benutze ich 'touchesBegan' und' touchesEnd', und es funktioniert gut. Das Problem kann in Code sein, den du nicht gezeigt hast - aber du hast es nicht gezeigt, also gibt es jetzt einen Weg, es zu wissen. – matt