Orientierungswechsel unterbinden

  • Orientierungswechsel unterbinden

    Hi,

    ich habe einen Portrait-View-Controller den ich fuer Landscape sperren moechte.

    Bislang habe ich dies - auch unter iOS 6 - mit shouldAutorotateToInterfaceOrientation gemacht, was - obgleich unter iOS 6 deprecated - funktioniert.

    Leider wird die Methode in diesem Fall gar nicht aufgerufen.

    Auch habe ich parallel mal die neue Methode supportedInterfaceOrientations implementiert. Diese wird zwar aufgerufen - aber die explizit angegeben Orientierungen scheinbar ignoriert.

    Also momentan gelingt es mir einfach nicht den View-Controller zu sperren. Falls es relevant ist: der View-Controller ist in einem Navigation-Controller 'eingebettet'...

    Thx im voraus,

    Ekki
  • Wie die Drone schon sagte, Du musst UINavigationController ableiten. In der Subklasse implementierst Du dann einfach

    Quellcode

    1. - (NSUInteger)supportedInterfaceOrientations {
    2. return [self.topViewController supportedInterfaceOrientations];
    3. }

    Und schon kannst Du in den von Deinem NavigationController angezeigten ViewControllern jeweils entscheiden, wie rotiert werden soll.

    Michael
  • oh ich nehme es zurueck - durch Deine Delegierung hast Du es ja auf der globalen Ebene entzerrt! Nach das ziehe ich gleich nach. Aktuell ist es naemlich so bei mir:

    Quellcode

    1. - (NSUInteger)supportedInterfaceOrientations
    2. {
    3. UIViewController *tController = [self topViewController];
    4. if ([tController isKindOfClass:[Place25ViewController class]]) {
    5. return UIInterfaceOrientationMaskLandscape;
    6. }
    7. if ([tController isKindOfClass:[EBXCOComplexArticleController class]]) {
    8. if ([EBApplication isPortrait]) {
    9. return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
    10. }
    11. else {
    12. return UIInterfaceOrientationMaskLandscape;
    13. }
    14. }
    15. return [super supportedInterfaceOrientations];
    16. }
    Alles anzeigen



    daher die zentralisierungsanmerkung
  • Ich hoffe es ist okay wenn ich das Thema wieder aufgreife...

    Ich habe folgenden Aufbau:
    UINavigationController-Subclass -> UITableViewController1 -> UITableViewController2
    osxentwicklerforum.de/index.php/Attachment/4935/

    Den zweiten der TableViewController würde ich gerne ausschließlich im Landscape-Modus betreiben. Ich habe die Subclass mit folgender Methode erweitert:

    Quellcode

    1. #pragma mark - Rotation
    2. -(BOOL)shouldAutorotate {
    3. return YES;
    4. }
    5. - (NSUInteger)supportedInterfaceOrientations
    6. {
    7. UIViewController *tController = [self topViewController];
    8. if ([tController isKindOfClass:[PlanGridViewController class]]) {
    9. return UIInterfaceOrientationMaskLandscape;
    10. }
    11. return [super supportedInterfaceOrientations];
    12. }
    Alles anzeigen



    PlanGridViewController ist der besagte zweite Controller. Leider wird mit der hier vorgeschlagenen Methode nur der topViewController behandelt... Gibt es für meinen Fall auch eine Lösung?
  • Eigentlich sollte das funktionieren. Noch flexibler ist es allerdings, den Aufruf zu delegieren anstatt die Klasse abzufragen:

    Quellcode

    1. - (NSUInteger)supportedInterfaceOrientations
    2. {
    3. UIViewController *tController = [self topViewController];
    4. return [tController supportedInterfaceOrientations];
    5. }
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Dann nimmst Du halt den:

    Quellcode

    1. - (NSUInteger)supportedInterfaceOrientations
    2. {
    3. UIViewController *tController = self.viewControllers[0];
    4. return [tController supportedInterfaceOrientations];
    5. }


    Dann hab ich ja auch wieder den RootViewController/TopViewController. und wenn ich viewControllers[1] nehme schmeißt er mir ne exception ums ohr... Ich überleg mir am besten en andere Struktur, das ist mist so...
  • Der Navigationstack baut sich von unten nach oben auf, also hat der Rootviewcontroller den Index 0 und der Topviewcontroller ist das letzte Element im Array viewControllers.

    DanielBocksteger95 schrieb:

    wenn ich viewControllers[1] nehme schmeißt er mir ne exception ums ohr...

    Das wundert mich nicht. Es müssen ja nicht immer 2 (oder mehr) Controller im Stack liegen.
    „Meine Komplikation hatte eine Komplikation.“