5

My iPad app intensywnie korzysta z autorotacji. To jest świetne. Zauważyłem jednak, że jeśli ukryty widok zostanie zwolniony przez domyślną implementację didReceiveMemoryWarning (zgodnie z opisem here), gdy widok zostanie ponownie załadowany ze stalówki, a ja znajduję się w orientacji poziomej, zostanie załadowany w pionie. To sieje spustoszenie w interfejsie, dopóki nie obrócę iPada ręcznie i nie zmusi go do właściwego ustawienia.Dlaczego system iOS nie wykonuje Autorotacji widoku załadowanego z końcówki po wydaniu przez didReceiveMemoryWarning?

Założono, że system iOS załaduje widok w bieżącej orientacji; tak właśnie robi się po uruchomieniu aplikacji. Ale nie, nie po rozładowaniu przez didReceiveMemoryWarning. Dlaczego nie? I jak mogę to zrobić?

+0

Czy widok znajduje się poza hierarchią widoku (nie jest to podgląd widoku UIViewController)? – dstnbrkr

+0

@dbarker - Nie, w rzeczywistości jest to główny widok aplikacji. – theory

+0

@dbarker Ah, ale patrząc bardziej uważnie, widzę, że to subviews tego widoku, które nie są odpowiednio obrócone. Podpisy zawarte w stalówce są odpowiednio obracane. Raczej. Hrm. Coś może być z moją metodą '-willAnimateRotationToInterfaceOrientation: duration:' . Może nie zostanie wywołany, ponieważ obrót nie jest animowany? – theory

Odpowiedz

4

Odpowiedź, ustalona dzięki wskaźników z dbarker to, że metody rotacji kontrolera widoku, w tym -willRotateToInterfaceOrientation:duration: i -willAnimateRotationToInterfaceOrientation:duration:, nie zostanie wywołana, gdy widok jest załadowany po wdrożenie domyślnym didReceiveMemoryWarning rozładunku pogląd. Nie mam pojęcia, dlaczego byłoby inaczej na uruchomienie aplikacji, ale mam obejście

Co zrobiłem było ustawić logiczną ivar nazwie unloadedByMemoryWarning, aby YES w didReceiveMemoryWarning, tak:

- (void) didReceiveMemoryWarning { 
    unloadedByMemoryWarning = YES; 
    [super didReceiveMemoryWarning]; 
} 

następnie w viewDidLoad, jeśli flaga jest prawda, ustawić go do NO a następnie wywołać metody rotacji sobie:

if (unloadedByMemoryWarning) { 
    unloadedByMemoryWarning = NO; 
    [self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0]; 
    [self willAnimateRotationToInterfaceOrientation:self.interfaceOrientation duration:0]; 
    [self didRotateFromInterfaceOrientation:self.interfaceOrientation]; 
} 

Kinda ssie, że muszę to zrobić, ale to nie działa, a teraz "m mniej martwi się o to, że zostanie zabity przez iOS za używanie zbyt dużej ilości pamięci.

+0

Mam do czynienia z tym samym problemem w mojej aplikacji na iPada. To dziwne zachowanie, ale twoje rozwiązanie pomogło mi. – sandy

+0

Wypróbowałem to rozwiązanie, ale niestety nie robiłem tego z mojej strony. Bleh ... * kopie dalej * – Kalle

1
  1. Myślę, że iOS 5 może to naprawić.

  2. Na iOS 4.3, miałem szczęście z inną poprawką. Po obciążeniu od stalówki:

    [parent.view addSubview:nibView]; 
    nibView.frame = parent.view.frame; 
    [nibView setNeedsLayout]; 
    

    Jeśli to działa, można odrzucić logikę unloadedByMemoryWarning, ponieważ jest to bezpieczne każdy ładunek. Otrzymałem kod: & (w zasadzie) od here.

Powiązane problemy