2013-08-12 16 views
8

Na komputerze Mac zawsze można uzyskać lokalizację myszy "poza strumieniem zdarzeń" (tzn. Nawet jeśli nie subskrybujesz żadnych metod delegatów dla mouseUp: i innych), dzwoniąc pod numer [NSEvent mouseLocation].Pierwsze poprawki przy uruchomieniu na iOS

Czy jest jakiś sposób na iOS, aby uzyskać bieżące wydarzenia dotykowe bez odsłuchu touchesBegan:?

Pytam, ponieważ istnieje co najmniej jedna sytuacja, w której touchesBegan nie nazywa się: podczas uruchamiania aplikacji, czy dotyk jest już w toku, touchesBegan nigdy nazywa. W rzeczywistości żadna z metod UIEvent związanych z dotykiem nie jest tak blisko określana, jak mi się wydaje (ani najwyraźniej nie jest to UIApplication/UIWindow sendEvent:).

Chciałbym nieco zmienić zachowanie mojej aplikacji na podstawie tego, czy dotyk jest w trakcie uruchamiania. Czy jest jakiś sposób, aby wykryć postęp w trakcie uruchamiania aplikacji pod numerem?

+0

Co oznacza "aplikacja uruchomiona" dla Ciebie? Czy wykonujesz czasochłonne działania na głównym wątku w czasie ładowania? – yurish

+0

"Przy uruchomieniu aplikacji" to ", gdy użytkownik klika ikonę aplikacji na trampolinie, a aplikacja otwiera się". Brak wydarzeń dotykowych to * nie *, ponieważ aplikacja jest nadmiernie obciążona intensywnym przetwarzaniem; dzieje się tak, ponieważ dotknięcia, które są w trakcie otwierania aplikacji, nie są dostarczane do aplikacji w normalny sposób. Próbuję dowiedzieć się, czy ktokolwiek zna sposób poza normalną pętlą, być może podklasy i nadpisywania, aby uzyskać dotknięcia, które są w toku arbitralnie, z dowolnej metody, w dowolnym czasie. – SG1

+0

Myślę, że to nie jest możliwe. UIApplication nie nadaje się do podklasy i jest to punkt wejścia do twojej aplikacji. –

Odpowiedz

6

Nie można tego zrobić. Prosty powód: wydarzenia dotykowe nie należą do Twojej aplikacji. Każde dotknięcie należy do elementu interfejsu użytkownika (lub odpowiadającego). Jak już wiesz, ten element otrzymuje wiadomości początkowe, przeniesione, zakończone i anulowane.

Dotyczy to nawet prawidłowo zaprogramowanej aplikacji: wszystkie zdarzenia dotyczące dotykania one są dostarczane do tego samego obiektu. W końcu, jak inny obiekt wiedziałby, co zrobić z tym zdarzeniem i jak powinien on prawidłowo zakończyć oczekiwane zachowanie?

Chociaż możesz (lub możesz, ale prawdopodobnie nie powinieneś) znaleźć pracy w obrębie swojej aplikacji, po prostu nie ma możliwości przejścia między aplikacjami.

A na komputerze Mac możesz zapytać o pozycję myszy, ale przy normalnym przepływie aplikacji zawsze zostanie naciśnięta mysz, zanim pojawi się zdarzenie z myszką.

Szczerze mówiąc, nie widzę żadnego powodu, dla którego byłoby to potrzebne i tak ... o, czekaj ... Mógłbym podzielić moją ikonę aplikacji na kilka obszarów ... nie jestem pewien, czy to już złamałoby prawo ochrony prywatności , jeśli dowiesz się, gdzie użytkownik ma swoją ikonę na ekranie.

+0

Dziękuję za poświęcony czas na odpowiedź i wyjaśnienie. Chociaż wydaje się, że jest to obecna odpowiedź kanoniczna, mam wrażenie, że chcę poczekać, aż pojawi się "odpowiedź" na to pytanie - np. W iOS 9 po tym, jak mój raport o błędzie jest adresowany;) Myślę, że mogę zmienić odpowiedzi później, chociaż ... – SG1

0

Myślę, że można po prostu "rozszerzyć" uruchamianie aplikacji. Kiedy miałem czas na wykonywanie zadań podczas uruchamiania aplikacji, pokazywałem ten sam ekran powitalny z UIActivityIndicator podczas wykonywania akcji.

Można po prostu utworzyć NSTimer, odczekać około 2 sekund iw tym czasie sprawdzić dotknięcia, a ekran powitalny będzie nadal wyświetlany.

Aby to zrobić, w applicationDidFinishLaunch wciśnij ViewController, który wygląda dokładnie tak jak ekran powitalny i sprawdź, czy nie ma w tym ViewController. Po tych 2 sekundach rozpocznij normalną inicjalizację. To zachowanie pomaga również, jeśli masz czasochłonne zadania podczas inicjalizacji.

Wiem, to obejście problemu, ale domyślam się, że nie można sprawdzić dotyku, ponieważ aplikacja będzie pracować nad głównym wątkiem, a dotknięcia będą również procesami w głównym wątku. Może się to zdarzyć również dlatego, że nie ma inicjowanych ViewControllerów ani UIWindow i nie można ich wysłuchać.

Mam nadzieję, że to pomaga.

-2

Możesz spróbować obsługi hitTest: withEvent: zamiast tego.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

Ponieważ zgodnie jabłkowego dokumencie „zwraca się najdalej potomka odbiornik hierarchii widzenia (w tym sam siebie), która zawiera określony punkt”.

Powiązane problemy