web-dev-qa-db-de.com

Autorotieren Sie einen einzelnen UIViewController in iOS 6 mit UITabBar

Ich habe eine App, die nur in Portrait Mode funktioniert, aber es gibt eine SingleView, die Video anzeigen kann. Ich möchte, dass diese Ansicht auch in landscape mode funktioniert. In iOS 6 kann ich jedoch nicht herausfinden, wie ich es tun kann. Jetzt habe ich diese:

In AppDelegate.m habe ich:

self.window.rootViewController = myTabBar;

dann in der Zusammenfassung des Projekts:

enter image description here

und ich habe festgestellt, dass ich in iOS 6 die Ansichtsdrehung erkennen muss, indem ich Folgendes tun muss:

- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}

// Tell the system It should autorotate
- (BOOL) shouldAutorotate {
return YES;
}

also füge ich den obigen Code nur in meine UIViewController ein, die ich auch in Landschaft verwenden möchte, aber nicht funktionieren, weiß jemand, wie ich es schaffen kann? Ich möchte nur die Autorotate, wenn das Video gezeigt wird.

25
Piero

Erstens sollten Ihre Zieleinstellungen folgendermaßen aussehen: Supported Interface Orientations

In UITabBarController:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

-(NSUInteger)supportedInterfaceOrientations
{
    if (self.selectedViewController) 
        return [self.selectedViewController supportedInterfaceOrientations];

    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

In Ihrem ViewController:

a) wenn Sie nicht drehen möchten:

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

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

b) wenn Sie in die Landschaft drehen möchten:

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

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

Bearbeiten:

Eine andere Lösung besteht darin, diese Methode in AppDelegate zu implementieren:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    NSUInteger orientations = UIInterfaceOrientationMaskAll;

    if (self.window.rootViewController) {
        UIViewController* presented = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presented supportedInterfaceOrientations];
    }
    return orientations; 
}
49
mientus

Ich würde einen Kommentar schreiben, aber ich kann es nicht, also poste ich dies als Antwort. 

Das war mein Szenario:

Meine App unterstützt die Änderung der Orientierung nur für bestimmte Ansichten. Ich konnte nicht herausfinden, wie sie nur für die gewünschten Zwecke verwendet werden sollte. Dann kam ich zu dieser Frage und sah die Antwort von Mientus (Danke dafür) Er schlug vor, welche Unterklasse UITabBarController war, und überschrieb diese Methoden:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{

    NSLog(@"AUTO ROTATE IN CUSTOM TAB BAR");
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}


-(NSUInteger)supportedInterfaceOrientations{

    NSLog(@"supportedInterfaceOrientations IN CUSTOM TAB BAR");

    if (self.selectedViewController)
        return [self.selectedViewController supportedInterfaceOrientations];

    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate{

    NSLog(@"shouldAutorotate IN CUSTOM TAB BAR");
    return [self.selectedViewController shouldAutorotate];
}

dann hätte ich in jedem View-Controller die Methoden, um anzuzeigen, ob ich eine Drehung wollte oder nicht. Die Methoden in UITabBarController wurden aufgerufen, aber nicht die in meinem Viewcontroller. Daher fand die Rotation immer noch statt, wo ich es nicht wollte. Dann subclasse ich UINavigationController und überschreibe die gleichen Methoden nur mit dieser Änderung auf der unterstütztenInterfaceOrientation, um so auszusehen:

- (NSUInteger)supportedInterfaceOrientations{

NSLog(@"supportedInterfaceOrientations IN CUSTOM NAV BAR CALLING CURRENT VIEW CONTROLLER");
UIViewController* presented = [[self viewControllers] lastObject];
return [presented supportedInterfaceOrientations];

}

was das im Grunde macht, bekommt der aktuelle View Controller und fragt dann nach der unterstützten Orientierung und voila meine Methoden werden in meinem Viewcontroller aufgerufen und ich kann die Orientierung dort erledigen, wo ich es will.

3
Oscar Salvador

Ist die Ansicht, in der Sie eine Unteransicht der Ansicht "Nur Porträt" drehen möchten? Normalerweise wird das Rotationsverhalten von Ansichten von rootviewcontroller übernommen. Wenn Sie dann in "rootviewcontroller" mit "NEIN" zurückgeben, stoppen Sie die Rotation in jeder einzelnen Unteransicht.

Ich schlage vor, Ihre Architektur auf diese Weise aufzuteilen:

rootViewController -> supportedInterfaceOrientations = Portrait & shouldAutorotate = YES NORotationViewControllers -> supportedInterfaceOrientations = Portrait & shouldAutorotate = YES rotationViewControllers -> unterstütztInterfaceOrientations = All & shouldAutorotate = YES

Wenn Sie dies noch nicht gelesen haben, werfen Sie einen Blick auf: Unterstützung mehrerer Schnittstellenausrichtungen

0
Beppe