2011-02-14 9 views
6

Używam willRotateToInterfaceOrientation do zamiany widoków, gdy mój iPad obraca się. Jeśli mam widok modalny lub widok alertu otwarty, gdy moje urządzenie obraca się i zamienia widoki, widok zostaje zamieniony, a alert znika i nie pojawia się ponownie, nawet jeśli alarm zostanie "przedstawiony" później.Jak zatrzymać znika widok modalny podczas obracania na iPadzie?

Edytuj: Zawęziłem ten problem. Kiedy przedstawiono widok modalny z UIModalPresentationFullScreen, widok modalny "przetrwa" rotacje.

Co mogę zrobić, aby to naprawić?

Oto moja realizacja willRotateToInterfaceOrientation:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

// 
// Load an alternate view depending on the orientation 
// 


if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:theLandscapeView]; 
    self.view.bounds = CGRectMake(0, 0, 1024, 768); 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (-90)); 
    [UIView commitAnimations];  

}else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:theLandscapeView]; 
    self.view.bounds = CGRectMake(0, 0, 1024, 768); 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (90)); 
    [UIView commitAnimations]; 

}else if (toInterfaceOrientation == UIInterfaceOrientationPortrait) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:thePortraitView]; 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (0)); 
    self.view.bounds = CGRectMake(0, 0, 768, 1024); 
    [UIView commitAnimations]; 

}else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 

    [UIView beginAnimations:@"" context:nil]; 
    [self setView:thePortraitView]; 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (180)); 
    self.view.bounds = CGRectMake(0, 0, 768, 1024); 
    [UIView commitAnimations]; 
} 
} 
+0

Dzięki. Na razie pracuję, nie zamieniając widoków, ale to nie jest rozwiązanie ... – Moshe

+0

Tak, nigdy nie spotkałem się z tym problemem, ale to jest po prostu dlatego, że zmieniam tylko rozmiar widoków dotyczących zmiany orientacji zamiast ich zastępowania . Czy byłoby możliwe zaprezentowanie strony modalnej z przejrzystego widoku hostingowego, ale czy twoja zawartość powinna znajdować się w wyglądzie tego, który jest wyłączony przy zmianie orientacji? –

+0

@BradLarson - Dziękujemy za spojrzenie. Myślę, że Twoja sugestia działałaby, ale jest nieznacznie nieefektywna, ponieważ musisz załadować dodatkowy widok (kontroler). Na razie czekam, aż Apple odpowie na to pytanie i ręcznie zmieniam rozmiar itp. Chciałem tego uniknąć, ponieważ UIImageViews nie przyjmuje tego zbyt dobrze. – Moshe

Odpowiedz

2

Gdybym rozwiązania tego problemu, chciałbym wykonać jedną z następujących czynności

  1. dodać alternatywne widoki do widoku macierzystego, a nie zmieniaj właściwości widoku
  2. Utwórz projekt dla widoków, które nie wymagają wymiany widoku pełnego, ale przestawiają lub ukrywają podelementy widoku.
  3. zaprezentować dowolną modal z ViewController korzenia hierarchii

będę ciężko pracować, aby nie zamienić się pogląd całkowicie ze względu na orientację. Wygląda na to, że nadal będzie występować problem, nawet po rozwiązaniu tego problemu.

0

Jeśli zamieniasz widoki, powinieneś również zamienić widoki modalne, myślę.

Na przykład, jeśli przedstawisz kontroler typu popover - zostanie on automatycznie odrzucony, a następnie pojawi się z obrotem interfejsu użytkownika.

0

Oto pomysł: utrzymuj stały widok główny, ale zmień widok podrzędny do widoku pionowego lub poziomego. coś takiego:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    // Remove the current subview from the main view 
    if (self.view.subviews.count) { 
     [self.view.subviews objectAtIndex:0] removeFromSuperview]; 
    } 

    // Use your if-else block, but change [self setView:] for [self.view addSubview:] 
} 

Więc teraz podczas tworzenia modal, zostanie on połączony z kontrolerem, który ma teraz stałą głównego widoku.

Zauważ, że tego nie przetestowałem, ponieważ wracam do kodowania po dwóch tygodniach przerwy ... Powodzenia!

Powiązane problemy