Jak ograniczyć moją aplikację do trybu poziomego?

Moja aplikacja na iPada została stworzona przy użyciu szablonu SplitView. Zastanawiam się, jaki jest najlepszy sposób, aby ograniczyć moją aplikację do trybu poziomego?

Wypróbowałem metodę overriding shouldAutorotateToInterfaceOrientation: w DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

Ale 4.2 GM jest nadal buggy i nie pokazuje widoku kontrolera. Jakie mam inne możliwości?

Z góry dzięki.

UPDATE1

  • Złożyłem już zgłoszenie błędu: identyfikator błędu #8620135

  • Moja aplikacja jest prawie skończona i muszę znaleźć pracę-arround, ponieważ nie sądzę, że rozwiążą to zanim 4.2 oficjalnie wyjdzie (GM już wyszedł!)

    Aby odtworzyć błąd, wystarczy użyć szablonu SplitView i nadpisać powyższą metodę w dowolnym z kontrolerów UIView (RootViewController lub Detailviewcontroller)

UPDATE2

Znalazłem obejście. (Zobacz UPDATE3 dla pełnego work-around)

Ustaw Uisupportedinterface orientations tylko do obsługi krajobrazu, spowoduje to uruchomienie aplikacji w trybie poziomym, umożliwiając poprawne uruchomienie DetailViewController (stąd poprawnie pokazane)

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

Ale jeśli obrócisz urządzenie, zmieni się tryb portretowy!!!, więc jest nadal konieczne, aby nadpisać shouldAutorotateToIntercafeOrientation: Jak wyżej

Dyskusja:

Gdyby to nie był błąd, oczekiwałbym ostrzeżenia lub błędu wykonania, wyjątku lub czegoś takiego, gdy uruchamianie aplikacji w orientacji, która nie jest obsługiwana przez kontroler widoku. Poza tym, dlaczego tylko DetailViewController nie pokazuje? Jeśli taka byłaby Specyfikacja, wtedy RootViewController również nie powinien się wczytać. Nie sądzisz? dzięki za pomoc... ;)

UPDATE3

Po dalszych testach zdałem sobie sprawę, że powyższe obejście nie działa w niektórych przypadkach. Na przykład podczas uruchamiania aplikacji, gdy urządzenie znajduje się w krajobrazie, nie będzie działać!. Prawdziwy problem wydaje się być, że w iOS4. 2GM UISplitViewController potrzebuje wszystkie jego Kontrolery mają wszystkie obroty, aby być dostępne w czasie ładowania. Tak jest konieczne, aby go oszukać, więc ładuje się w trybie krajobrazowym, a następnie nie pozwala mu obracać kontrolerów widoku.

Oto nowe obejście tego irytującego iBug ' a.

Krok 1: Set Info.plist jak tak:

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

Krok 2 Ustaw nową flagę w DetailViewController.m lub .h (from Splitview Template)

BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //WORK-ARROUND: Bug ID# 8620135.
    if (lockRotation) {
        return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }else{
        return YES;
    }
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called
    lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.
}
- (void)viewDidAppear:(BOOL)animated {
    //set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called
    lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135.
    [super viewDidAppear:animated];
}

WAŻNA UWAGA: Uwaga że ten błąd pojawia się tylko wtedy, gdy uisplitviewcontroller jest załadowany, a nie za każdym razem pojawia się jego widok. Dlatego, aby zobaczyć ten błąd, upewnij się, że aplikacja została zakończona wcześniej.

Author: Prabh, 2010-11-02

4 answers

Zadałem pytanie z nagrodą 500, że wydaje się być tym samym, co Ty .

Z mojego ograniczonego doświadczenia o wiele łatwiej jest zrobić aplikację na iPhone ' a tylko w krajobrazie niż aplikację na iPada tylko w krajobrazie. Nie jestem pewien, dlaczego jest jakaś różnica, ale kroki, które Apple mówi, aby zrobić to krajobraz-tylko nie działają na własną rękę.

 2
Author: Jonathan.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 09:58:07

Try this (it works):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation {
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        return YES;
    }
    else 
    {
        return NO;
    }
}
 1
Author: Sid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-27 07:00:55

Sprawdź tę aplikację na iPhone ' a w trybie poziomym, Jeśli jeszcze tego nie zrobiłeś. Miałem zamiar zasugerować po prostu dodanie UISupportedInterfaceOrientations do Twoich informacji.plist i określenie dwóch orientacji krajobrazowych. Ale, jak widać, nie jest to wystarczające, zgodnie z odpowiedziami na cytowane pytanie.

 0
Author: westsider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:27

Uważam, że jest to błąd, również miałem do czynienia z tym problemem. Jest to coś wspólnego z

UIInterfaceOrientationLandscapeLeft

Aby odtworzyć tę sytuację:

1) Utwórz nowy projekt iPada za pomocą szablonu UISplitViewController

2) edytuj info.plist

Supported interface orientations
-Landscape (left home button)
-Landscape (right home button)

3) DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
//    return YES;
 NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft);
 return interfaceOrientation == UIInterfaceOrientationLandscapeLeft;
}

4) uruchom go....Zobaczysz pusty czarny widok. i nie ważne jak się odwrócisz. Nigdy nie wykryto" interfejsu użytkownika".

Przy okazji, nacho4d's dodawanie Bool check work-around działa. Kciuki w górę:)

 0
Author: JapCon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-20 16:18:25