UIViewController obracać metod

głosy
17

Jaki przedmiot jest odpowiedzialny za dyspozytorskiego do UIViewControllerobrotu wywołań metod, tj:

  • shouldAutorotateToInterfaceOrientation:
  • willRotateToInterfaceOrientation:duration:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:

Wyobrażam sobie, że jest UIApplication(ale może AppDelegate lub UIWindow).

Kolejnym pytaniem jest, w jaki sposób obiekt wiedzieć, które UIViewControllerdo rozmowy?

Jak to jest wiedzieć, które UIViewControllerma swój pogląd jako podrzędny okna?

Czy można wysłać wiadomość lub właściwość można ustawić (z jakiegoś przedmiotu), który ustawia „Active” UIViewControllerdla aplikacji?

Utwórz 14/02/2009 o 00:50
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
13

Wydaje się, że UIApplicationjest dysponowanie wiadomość do aktywnego kontrolera widoku.

Ale w jaki sposób Państwa zdaniem instancja kontrolera dostać te wiadomości?

Komunikat jest kierowany do pierwszego kontrolera widoku którego pogląd został dodany do UIWindowprzypadku.

To sprowadza się do 3 podstawowych scenariuszy:

  1. ViewController którego widok dodaje się bezpośrednio do UIWindow przykładu (pojedynczego aplikacja widoku)

  2. Kontroler nawigacyjny w aplikacji opartych na nawigacji, a następnie kontroler nawigacyjny przekazuje komunikat do aktywnych widokiem zobaczyć kontrolera.

  3. Pasek zakładka Controller w aplikacji opartej na pasek kart, wówczas kontroler pasek kart przekazuje komunikat do aktywnych widokiem zobaczyć kontrolera (lub aktywny kontroler nawigacyjny).

Problemem będzie trzeba, to czy można zbudować aplikację z wieloma widokami, ale nie używać kontrolera nawigacyjnego lub kontrolera Tab Bar. Jeśli wymieniać poglądy i poza UIWindowprzykład ręcznie, nie będzie otrzymywać tych wiadomości w sposób wiarygodny. Jest to podobne do stanowisk takich jak ten: iPhone viewWillAppear nie wypalania

Wystarczy użyć konwencje Apple dla wielu poglądów i być w porządku. Nadzieję, że to ktoś zapisuje godzinę lub dwie

Odpowiedział 19/02/2009 o 05:49
źródło użytkownik

głosy
4

Jak to wiedzieć które UIViewController ma swój pogląd jako podrzędny okna?

UIViewController klasy utrzymuje statyczną mapę między widokami i ich zdaniem kontrolerów. Ta mapa jest zapytaliśmy w kilku kluczowych miejscach wewnątrz Cocoa Touch. W szczególności [UIView nextResponder] pyta go i zwraca kontroler jeśli okaże.

Chyba UIWindow robi tego samego odnośnika z widoku głównym, aby wiedzieć, który kontroler do przekazania do obrotu zdarzeń. Sprawdzi, to następnym razem będę szukać czegoś w demontażu. (Spędziłam trochę czasu reverse-engineering Cocoa Touch, aby zrozumieć jak to wszystko działa tam).

Odpowiedział 06/05/2009 o 12:15
źródło użytkownik

głosy
4

To wszystko jest magia Nie zawsze martwić. Wystarczy dodać widok główny kontroler do okna - lub uzyskać pasek kart lub kontrolera nawigacyjnego zrobi to za ciebie - i będzie otrzymywać tych wiadomości.

(Ale jeśli rozglądamy z debuggera, można dojść do tego samego wniosku mam:. Jest jakiś wewnętrzny tabela odwzorowania widok każdy kontroler z powrotem do sterownika, a wiadomości są wysyłane na podstawie tego linku)


Aktualizacja: To był naprawdę magiczny prywatny w 2009 roku, kiedy po raz pierwszy napisał tę odpowiedź, ale późniejsze zmiany iOS dokonały API za nim publicznego. Kontroler widok główny jest teraz dostępny za pośrednictwem UIWindow.rootViewControllernieruchomości, a drzewo potomnych kontrolerów widzenia jest tworzone przy użyciu UIViewController.childViewControllerswłasności.

Rodzic kontrolery widoku są odpowiedzialni za swoje dzieci powiadamiania o zmianach orientacji. (Nie jestem pewien, jak kontroler widok korzeń jest powiadamiany, ale można ustawić punkt przerwania i dowiedzieć się.) Jak -shouldAutomaticallyForwardRotationMethodsmetoda decyduje UIViewController zrobi to za Ciebie. Jeśli zwróci NO, stajesz się odpowiedzialny za to w twoich -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:i -didRotateFromInterfaceOrientation:metod.

Odpowiedział 14/02/2009 o 01:42
źródło użytkownik

głosy
1

Mam podobny problem.

Mam gra działa w orientacji poziomej (zarówno z lewej i prawej krajobrazu).

W celu zarządzania aplikacji Multi-view używam UIViewController korzeniowy, tj obojętne UIViewController z UIView, że nic nie robi. Następnie dodać każdy inny UIView do niego jako podrzędny.

Po uruchomieniu aplikacji, emulator szybko obraca się do orientacji pionowej, a ja dostać każdy z moich poglądów z jego własność wygląda jak rama (0, -80,320,480). Prowadzi to do widzenia jest obcięta przez 160 x 320 prostokąt po prawej stronie.

Zauważyłem, że - shouldAutorotateToInterfaceOrientation: Metoda każdego podrzędny jest wywoływana tylko raz, i to się dzieje, gdy jest on dodawany do widoku głównego. Później, podczas obracania urządzenia, tylko widok główny dostaje to metoda nazywa.

Nic więc dziwnego, każdy z - willAnimate * Metody połączeń są wysyłane tylko do widoku głównego, tak, definiowanie dowolnej z tych metod w subviews ma sensu.

Metody te są nazywane każdym orientacja zmienia się na orientacji przyjętej przez - shouldAutorotateToInterfaceOrientation: metoda. więc pomyślałem mogłem chnage właściwość ramki moich subviews' stamtąd.

Aby to osiągnąć, I zdefiniowano następujące metody w mojej klasie rootViewController:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
        ...
}

Nie rozumiem, dlaczego właściwość rama nie jest aktualizowana, ale wiem, że to rozwiązanie działa.

Mam nadzieję że to pomoże....

Odpowiedział 25/03/2010 o 05:20
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more