performSelector: withObject: afterDelay: funktioniert nicht von scrollViewDidZoom

8

Ich habe das Gefühl, dass ich das wissen sollte, aber ich bin jetzt stundenlang ratlos und mir sind die Ideen ausgegangen.

Die Theorie ist einfach, der Benutzer manipuliert den Zoom und die Positionierung in einem Scrollview mit einem Pinch. Wenn sie diesen Pinch für eine kurze Zeit halten, zeichnet der Scrollview die Zoomstufe und die Inhaltsoffsets auf.

Also dachte ich, ich würde einen performSelector starten: withObject: withDelay für die delegate-Methode scrollViewDidZoom. Wenn es abläuft, notiere ich die Einstellungen. Ich lösche den geplanten Anruf jedes Mal, wenn scrollViewDidZoom aufgerufen wird und wenn die Pinch-Geste beendet ist.

Das habe ich:

%Vor%

Dies ist die Ausgabe:

2010-05-19 22: 43: 01.931 Timer zurücksetzen
2010-05-19 22: 43: 01.964 Timer zurücksetzen
2010-05-19 22: 43: 02.231 Timer zurücksetzen
2010-05-19 22: 43: 02.253 timer zurücksetzen 2010-05-19 22: 43: 02.269 Timer zurücksetzen
2010-05-19 22: 43: 02.298 timer zurücksetzen 2010-05-19 22: 43: 05.399 Löschen des Timers

Wie Sie sehen können, sollte die Verzögerung zwischen dem letzten und dem zweitletzten Ereignis mehr als genug sein, damit der verzögerte Selektoraufruf ausgeführt werden kann.

Wenn ich performSelector ersetzen: withObject: withDelay mit plain alt performSelector: Ich bekomme Folgendes:

2010-05-19 23: 08: 30.333 Zurücksetzen des Timers
2010-05-19 23: 08: 30.333 position locked
2010-05-19 23: 08: 30.366 Zurücksetzen des Timers
2010-05-19 23: 08: 30.367 Position gesperrt
2010-05-19 23: 08: 30.688 Löschen des Timers

Was ich nicht will, dient nur dazu, zu zeigen, dass es nur die Verzögerung ist, die bewirkt, dass es nicht funktioniert, nicht etwas mit dem Selektor zu tun hat, der nicht in der Kopfzeile deklariert ist, falsch geschrieben ist oder aus irgendeinem anderen Grund.

>

Irgendwelche Ideen, warum es nicht funktioniert?

    
oldbeamer 19.05.2010, 13:20
quelle

2 Antworten

19

Ich denke, dass Timer-Ereignisse während der Verfolgung ignoriert werden (wenn ein Finger nicht gedrückt ist, um zu scrollen oder zu zoomen). Möglicherweise müssen Sie den Selektor in einem anderen Modus ausführen (siehe [NSObject performSelector:withObject:afterDelay:inModes:] ). Versuchen Sie insbesondere, die Konstante NSRunLoopCommonModes für den Modus zu verwenden.

    
Brian 19.05.2010, 13:36
quelle
3

Nur um hinzuzufügen, was Brian gesagt hat - hier ist meine Umsetzung seiner Antwort:

%Vor%

Hinweis - inModes: benötigt ein Array von Modi.

    
Madclouds 06.03.2014 16:24
quelle