Frage

Ich habe eine UITabBarController, und jede Zunge behandelt einen anderen UIViewController, die bei Bedarf auf den Stapel neuen Controller schiebt. In zwei diese Registerkarten ich brauche, wenn ein bestimmte Controller erreicht ist, die Fähigkeit, das iPhone und visualisieren eine Ansicht im Querformat zu drehen. Nach dem Kampf habe viel ich finde, dass es zwingend notwendig, Subklassifizieren UITabBarController außer Kraft zu setzen ShouldAutorotateToInterfaceOrientation ist. Allerdings, wenn ich einfach ja bei der Umsetzung zurückkehrt, wird die folgende unerwünschte Nebenwirkung auftritt:

jeder Controller in jedem Registerkarte automatisch im Querformat gesetzt wird, wenn das iPhone drehen.

Auch übergeordnete ShouldAutorotateToInterfaceOrientation in jedem Controller zurückzukehren NO funktioniert nicht. Wenn das iPhone gedreht wird, wird die Steuerung im Landscape-Modus setzen

I umgesetzt ShouldAutorotateToInterfaceOrientation wie im subclassed UITabBarController folgt:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if([self selectedIndex] == 0 || [self selectedIndex] == 3)
        return YES;

    return NO;
}

Damit nur die beiden Laschen Ich bin an tatsächlich bekommen Unterstützung für Landscape-Modus. Gibt es eine Möglichkeit Landschafts Modus für einen bestimmten Controller auf dem Stapel einer bestimmten Registerkarte zu unterstützen?

Ich habe versucht, ohne Erfolg, so etwas wie

(BOOL) ShouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

if([self selectedIndex] == 0 || [self selectedIndex] == 3)
{   
   if ([[self selectedViewController] isKindOfClass: [landscapeModeViewController class]])
           return YES;
    }

     return NO;

}

Auch ich versuchte, die delegierte Methode didSelectViewController verwenden, ohne Erfolg. Jede Hilfe wird sehr geschätzt. Danke.

War es hilfreich?

Lösung

Das funktioniert für mich:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}

Andere Tipps

Hier ist eine Erweiterung UITabBarController, dass die Delegierten auf die aktuell ausgewählte Kind Controller shouldAutorotateToInterfaceOrientation aufruft. Mit dieser Erweiterung, brauchen Sie nicht mehr UITabBarController Unterklasse und Sie können shouldAutorotateToInterfaceOrientation in Ihrem Controller verwenden, wie man erwarten würde.

UITabBarController + Autorotate.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autorotate)
@end

UITabBarController + Autorotate.m:

#import "UITabBarController+Autorotate.h"

@implementation UITabBarController (Autorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    UIViewController *controller = self.selectedViewController;
    if ([controller isKindOfClass:[UINavigationController class]])
        controller = [(UINavigationController *)controller visibleViewController];
    return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

Ich habe in der Lage gewesen, dies jetzt für eine Weile zu verwenden (von meinem App-Tab-Leiste Controller) ohne Probleme:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

Auf diese Weise in dem entsprechenden VC, bekommen wir tun die real überprüfen, in diesem Fall für eine Fotogalerie Ansicht (was sonst?):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

Meine Galerie-Ansicht nicht einmal an der Spitze des Stapels für einen bestimmten Nav-Controller ist. Es wird immer noch genannt wird.

Ach, ich gerade entdeckt, dass diese nicht Arbeit so gut, wenn der VC lauert in der MoreViewController (im Gegensatz zu den vier Haupt-Tabs). In diesem Fall meine Galerie nie VC wird aufgerufen. Ich denke, es ist, weil die VC Ich habe die ganze Zeit angerufen wirklich die nav-Controller aus dem ausgewählten Register ist, die und propagiert Dinge an dem entsprechenden VC, in diesem Fall meiner Fotogalerie VC. Aber für die Mehr VC, die Dinge funktionieren nicht so schön ... uuuuund Dinge gehen dreh bergab. : \

ich versuchte, die Modifikationen von Andreas Verwendung (an anderer Stelle in diesem Thread sehen), ohne Erfolg. Clues willkommen!

Ich lief in die gleichen Fragen wie Sie taten, wenn sie mit dem UITabBarController arbeiten. Ich brauchte zu steuern, welche UIViewControllers durften drehen, und welche nicht. Mein Hauptproblem war mit den MORE-Registerkarte. Ich wollte nicht, dass keines des UIViewControllers in den MORE-Registern aufgenommen zu drehen.

war meine Lösung meine eigenen UITabBarController zu schaffen, die ich genannt MyTabBarController:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

Dann implementiert ich die ShouldAutorotateToInterfaceOrientation Methode:

@implementation MyTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 UIViewController *controller = [self selectedViewController];

 if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
 {
  return interfaceOrientation == UIInterfaceOrientationPortrait;
 }

 return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

ich brauchte, um herauszufinden, ob die MORE Registerkarte ausgewählt wurde. Dies ist ein zweistufiger Prozess; wenn die Registerkarte Weiteres zunächst die API ausgewählt ist, liefert einen selectedIndex höher ist als 4, so musste ich die ausgewählten Controller mit dem moreNavigationController vergleichen.

Wenn ein UIViewController aus der MORE Registerkarte ausgewählt wird, dann wird die selectedIndex ist schließlich 4, aber die selectedController ist nicht die moreNavigationController mehr, aber die UIViewController ausgewählt.

Die if ((Controller == [self moreNavigationController]) || ([self selectedIndex] == 4)) kümmert sich um dieses Problem.

Nun, wenn ich meine Bewerbung meiner UIViewControllers in dem MORE-Register ausgeführt werden nicht gedreht. Ich hoffe, diese anderen Entwicklern helfen, die in die gleichen Probleme laufen wie ich.

Emilio

Von dem, was ich hier gesehen und an anderer Stelle habe ich genäht zusammen, um eine Lösung, die die Methode shouldAutorotate verwendet, da der alte shouldAutorotateToInterfaceOrientation ist veraltet.

Ich habe es innerhalb einer Kategorie UITabBarController platziert. Ich hoffe dies ist zulässig!

// call to method shouldAutorotate replaces call to method shouldAutorotateToInterfaceOrientation (deprecated)
-(BOOL)shouldAutorotate
{ // check whether selected view controller should autorotate    
  UIViewController *controller = self.selectedViewController;
  if ([controller isKindOfClass:[UINavigationController class]])
    { // in case it is a navigation controller: get visible view of that
      controller = [(UINavigationController *)controller visibleViewController];
    }
  return [controller shouldAutorotate];
}

Danke, Danke, Danke. Dies hat seit 2 Tagen in herauszufinden, wie dies zu tun. Hier ist mein nehmen auf alle Ihre große Hilfe, wenn Sie einen TabBarController mit navigationControllers haben.

- (BOOL) ShouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

UIViewController *controller = self.selectedViewController;
if ([controller isKindOfClass:[UINavigationController class]])
    controller = [(UINavigationController *)controller visibleViewController];

if([controller isKindOfClass:[LOCviewcontroller class]])
    return YES;
else
    if([controller isKindOfClass:[personWebSiteView class]])
        return YES;
else return NO; 

}

Jede Kritik eines Codes des neophite Coder ist immer willkommen ... Buchse

Ist es wirklich OK UITabBarController Unterklasse (wie oben in der akzeptierten Antwort vorgeschlagen)?

Ich habe verstanden, dass Äpfel sagt so etwas wie „Sie sollten nie eine Unterklasse UITabBarController oder UINavigationController?“ - oder habe ich das falsch verstanden

Wie auch immer; Ich fand dieses Tutorial , wo sie ein UIViewController Unterklassen, in denen sie einen UITabBarController setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top