2009-07-27 15 views
3

Ich habe eine "navigation-basierte Anwendung", die auch immer eine Ansicht immer am unteren Rand des Bildschirms angezeigt werden muss. Ich habe diese neue Sicht auf eine UIWindow nach Auffassung der UINavigationController Zugabe:Mehrere Ansichten in einem UIWindow

// In my delegate's applicationDidFinishLaunching method 
[window addSubview:navigationController.view]; 
[window insertSubview:disclaimerController.view aboveSubview:navigationController.view]; 
[window makeKeyAndVisible]; 

Diese Ausnahme Rotation gut funktioniert. Die zweite Ansicht, die ich hinzugefügt habe, rotiert nicht richtig. Es ändert nicht die Position, und die Rotationsmethoden des View-Controllers werden nicht aufgerufen.

Offensichtlich gehe ich das in die falsche Richtung. Meine Frage ist, wie kann ich eine zweite Ansicht auf dem Bildschirm haben, die nicht zur Ansicht des Navigationscontrollers gehört? Vielen Dank.

Antwort

2

Wenn Sie eine Ansicht übereinander hinzufügen, indem Sie als Unteransicht hinzufügen, wird die Rotation nicht funktionieren (die Ansicht wird nicht über die Rotation informiert). Sie können die Ansicht mit dem Gerät registrieren, um über Rotationsereignisse benachrichtigt zu werden. Dann können Sie die Rotation programmatisch handhaben (dies wird nicht für Sie erledigt).

+0

Ich bin nicht sicher, ich das Problem richtig erklärt. Dies war spezifisch für das UIWindow, wo die erste dem UIWindow hinzugefügte Ansicht sich korrekt drehen würde und alle nachfolgenden Ansichten sich nicht drehen oder ihre Größe ändern würden, sondern in einer festen Position bleiben würden. Meine Lösung bestand darin, dem Fenster nur die Ansicht des NavigationControllers hinzuzufügen und der Ansicht des NavigationControllers weitere Ansichten hinzuzufügen. – codecaffeine

+0

O Sie haben dem Fenster zwei Ansichten hinzugefügt? – Daniel

+0

Ja, ich dachte, es könnte eine Lösung sein, da ich etwas von der Ansicht des Navigations-Controllers getrennt haben wollte. – codecaffeine

3

Wenn Sie eine Ansicht eines anderen View-Controller als Subview an das aktive Fenster der Anwendung hinzufügen, die Sie seine center, bounds und transform Eigenschaften mit window.rootViewController.view synchronisieren müssen. Stellen Sie außerdem sicher, dass Ihre Ansicht von oben nach richtige Initialisierung des Fensters hinzugefügt wird und nach seine Root-Subview wurde als Subview hinzugefügt.

Ich nehme an, dass dies auf mehrere Arten getan werden kann, ich habe es durch die Verwendung von Key-value observing funktioniert.

Hier die topViewController ist Instanz einer UIViewController Unterklasse und stellt den View-Controller der UIView, die auf der Oberseite des Anwendungsfensters

AppDelegate.m sein sollen:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [self.window.rootViewController.view addObserver:topViewController forKeyPath:@"transform" options:NSKeyValueObservingOptionNew context:@"rootView"]; 
    [self.window.rootViewController.view addObserver:topViewController forKeyPath:@"center" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"rootView"]; 
    [self.window.rootViewController.view addObserver:topViewController forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"rootView"]; 
    return YES; 
} 

topViewController ‚s .m Datei:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([(__bridge_transfer NSString*)context isEqualToString:@"rootView"]) 
    { 
     if([keyPath isEqualToString:@"transform"]) 
     { 
      self.view.transform = [[change objectForKey:NSKeyValueChangeNewKey] CGAffineTransformValue]; 
     } 
     else if ([keyPath isEqualToString:@"center"]) 
     { 
      self.view.center = [[change objectForKey:NSKeyValueChangeNewKey] CGPointValue]; 
     } 
     else if ([keyPath isEqualToString:@"bounds"]) 
     { 
      self.view.bounds = [[change objectForKey:NSKeyValueChangeNewKey] CGRectValue]; 
     } 
     else 
     { 
      [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
     } 
    } 
    else 
    { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 
+0

Durch weitere Untersuchung wird dies durcheinander gebracht, wenn eine andere Ansicht am unteren Rand der Unteransicht Array des Haupt-UIWindows ist. (Dies tritt auf, wenn z. B. MoviePlayerViewController präsentiert wird.) Dies kann jedoch weiterhin durch Unterklassenbildung des UIWindows und Behalten eines Verweises auf die erste Unteransicht in Methoden wie addSubview, insertsubview: atindex und willRemoveSubview verwaltet werden – burax