Verständnisfrage zur Interface Rotation

  • Verständnisfrage zur Interface Rotation

    Hallo!

    Ich habe in einen View-Controller die shouldAutoRotate...-Methode überschrieben. Die Rotation funktioniert. Ich rotiere nur senkrecht, will sagen: Portrait oder PortraitUpsideDown.

    Wenn ich aber einen anderen View, egal wie, also auch per push, zeige, ist dieser View noch in der alten RIchtung dargestellt. Ich habe in allen VCs die should...-Methode überschrieben, auch das funktioniert, wie ein Test gezeigt hat. Ich kann also in jedem View rotieren.

    Wie kann ich einem neuen View(Controller) die interfaceOrientation mitgeben, damit er richtig herum steht?
  • HI,
    du könntest damit

    Quellcode

    1. [[UIDevice currentDevice] orientation]


    herumspielen. Aber das Apple-Review wird dich in die Grenzen weisen. Wenn deine Rotation nicht richtig funktioniert, hast du mit Sicherheit ein Problem im Quellcode.

    Gruss
    Apoc
  • Ich habe ein interssantes Phänomen im Zusammenhang mit den Umbaumaßnahmen:

    Bisher habe ich einen View einfach mittels addSubview: an das window-Objekt des Delegate gehangen. Dadurch hatte ich aber keine Chance, die shouldRotate...-Methode auf unterster Ebene zu überschreiben. Ergebnis war das Problem wie beschrieben.

    Nun habe ich dieses Verfahren durch setRootViewController: mit einem regulären RootViewController ersetzt. Das funktioniert im Grunde prächtig, ich hänge meine verschiedenen Views mit Transitions und allem Schnickschnack an den View des RVC und bekomme auch die Rotation sauber hin.

    Allerdings werden nun die viewDidAppear:-(etc.-)Methoden der subViews (bzw. ihrer Controller) nicht aufgerufen - was läuft denn hier falsch?

    Muss ich zusätzlich zum setRootViewController: dessen View auch noch als subView anhängen (das widerspräche der Doku). Oder ist der Weg mit setRootViewController falsch und ich muss nur mit subViews zum window-Objekt arbeiten ...?!

    Ratlos.

    #Edit: Ich sollte erwähnen, dass ich den rootViewController im IB verdrahtet habe und nicht programmatisch setze.
  • Ich habe gerade das hier gefunden:
    If the view controller is added to a view hierarchy through code, the view controller will not get viewWillAppear (or viewDidAppear) messages. If you add it yourself you have to send the view controller the message yourself.

    Stimmt das? Ich kann mir das irgendwie nicht gut vorstellen ...
  • fwtag schrieb:

    Ich habe gerade das hier gefunden:
    If the view controller is added to a view hierarchy through code, the view controller will not get viewWillAppear (or viewDidAppear) messages. If you add it yourself you have to send the view controller the message yourself.

    Stimmt das? Ich kann mir das irgendwie nicht gut vorstellen ...

    Die meinen wahrscheinlich, dass Du den View des View-Controllers mit addSubview: zu irgendeinem anderen View hinzufügst. Das ist baba und solltest Du nicht tun. View-Controller immer schön über das Window oder andere View-Controller-Methoden zur Ansicht (z. B. presentModelViewController:animated:, pushViewController:animated: oder TabBarController) bringen.

    Seit 4.0 gibt's auch keinen Grund mehr, den Root-View-Controllers über addSubview: ins Window zu packen.
    „Meine Komplikation hatte eine Komplikation.“
  • Und wie bekomme ich dann die hübschen Transitions hin?

    Ich habe für verschiedene Ansichten (Hauptansicht, Liste, Einstellungen usw.) je einen View-Controller, tlw. als "normalen" VC und teilweise als NavigationDingens. Wenn ich nun ein Flip haben möchte, kann ich das doch nur auf View-Ebene machen - oder nicht? Ich habe es versucht, in den Block einfach nur das setRootViewController zu stecken, aber da animiert sich nix.

    Ist denn der (für mich neue) Weg, den jeweils aktiven VC über setRootViewController zu aktivieren falsch?
  • fwtag schrieb:

    Und wie bekomme ich dann die hübschen Transitions hin?

    Wenn Du die View-Controller modal anzeigst, kannst Du modalTransitionStyle vorher setzen. Da ist auch die Flip-Animation dabei. Das Utilities Template in Xcode macht das beispielsweise so.

    fwtag schrieb:

    Ich habe für verschiedene Ansichten (Hauptansicht, Liste, Einstellungen usw.) je einen View-Controller, tlw. als "normalen" VC und teilweise als NavigationDingens. Wenn ich nun ein Flip haben möchte, kann ich das doch nur auf View-Ebene machen - oder nicht? Ich habe es versucht, in den Block einfach nur das setRootViewController zu stecken, aber da animiert sich nix.

    Das ist naheliegend, klingt aber ein bisschen nach undokumentiertem Feature. Ich würde mich darauf nicht verlassen.

    fwtag schrieb:

    Ist denn der (für mich neue) Weg, den jeweils aktiven VC über setRootViewController zu aktivieren falsch?

    Den RootViewController sollst Du schon damit setzen. Du kannst damit laut Doku auch die View-Controller austauschen. Das mit den eigenen Animationen halte ich aber für grenzwertig.
    „Meine Komplikation hatte eine Komplikation.“
  • Nur, damit ich es kapiere:
    Wenn ich mit View-Transitions arbeiten möchte (bei denen ich deutlich mehr Freiheitsgrade habe), müssen die Views einem VC zugeordnet sein.
    Wenn ich mit mehreren ViewControllern arbeite, sollte ich mit presentModalView arbeiten, dann gehen auch rudimentäre Transitions.
    Wenn ich setRootViewController verwende, bewege ich mich "hart an der Grenze" und kann auf Transitions pfeifen.

    Entweder ich habe einen Denkfehler (ein View <-> ein Controller (<-> ein Modell) als Idealfall) oder das ist doch Murks ..
  • fwtag schrieb:

    Wenn ich mit View-Transitions arbeiten möchte (bei denen ich deutlich mehr Freiheitsgrade habe), müssen die Views einem VC zugeordnet sein.

    Mit Subviews kannst Du immer mit View-Transitions arbeiten. Bei den Views (viewController.view) solltest Du das nicht machen.

    fwtag schrieb:

    Wenn ich mit mehreren ViewControllern arbeite, sollte ich mit presentModalView arbeiten, dann gehen auch rudimentäre Transitions.

    ...oder mit Navigation-, TabBar-, PopOver- und SplitViewControllern. ;)

    fwtag schrieb:

    Wenn ich setRootViewController verwende, bewege ich mich "hart an der Grenze" und kann auf Transitions pfeifen.

    setRootViewController darfst Du zum Tauschen des RootViewControllers verwenden. Aber Du solltest da nicht mit Transitionen arbeiten. Das ist nicht dokumentiert.

    fwtag schrieb:

    Entweder ich habe einen Denkfehler (ein View <-> ein Controller (<-> ein Modell) als Idealfall) oder das ist doch Murks ..

    Was hat das mit Transitionen zu tun?
    „Meine Komplikation hatte eine Komplikation.“
  • Ich vermute dein Projekt ist schon etwas älteren Jahrgangs. Ein prakmatischer Ansatz dafür wäre z.B.:

    Quellcode

    1. [newViewController viewWillAppear:YES];´
    2. [rootView addSubview: newViewController.view];
    3. [newViewController viewDidAppear:YES]

    bzw.

    Quellcode

    1. [oldViewController viewWillDisappear:YES];
    2. [oldViewController.view removeFromSuperview];
    3. [oldViewController viewDidDisappear:YES];


    Du rufst die Events einfach selbst auf. Allerdings ist dieses Vorgehen in der Tat noch aus 2.0 Zeiten.

    Der Verwendung der angesprochenen Methoden presentModelViewController:animated: u. pushViewController:animated:
    würde ich auf jedenfall den Vorrang geben.
  • apoc schrieb:

    Ich vermute dein Projekt ist schon etwas älteren Jahrgangs. Ein prakmatischer Ansatz dafür wäre z.B.:

    Quellcode

    1. [newViewController viewWillAppear:YES];´
    2. [rootView addSubview: newViewController.view];
    3. [newViewController viewDidAppear:YES]

    bzw.

    Quellcode

    1. [oldViewController viewWillDisappear:YES];
    2. [oldViewController.view removeFromSuperview];
    3. [oldViewController viewDidDisappear:YES];


    Du rufst die Events einfach selbst auf. Allerdings ist dieses Vorgehen in der Tat noch aus 2.0 Zeiten.

    Damit machst Du es doch nur noch schlimmer. Das ist der beste Weg, um die App inkompatibel mit zukünftigen iOS-Versionen zu machen.

    apoc schrieb:

    Der Verwendung der angesprochenen Methoden presentModelViewController:animated: u. pushViewController:animated:
    würde ich auf jedenfall den Vorrang geben.

    Das ist der saubere Weg.
    „Meine Komplikation hatte eine Komplikation.“