iPhone: In Landschafts nur, nach dem ersten addSubview, UITableViewController dreht sich nicht richtig

StackOverflow https://stackoverflow.com/questions/1632117

  •  06-07-2019
  •  | 
  •  

Frage

Ein minimales illustratives Xcode Projekt hierfür ist auf Github .

Auf meinem UIWindow, wenn ich hinzufügen, zweite (und nachfolgende) UITableView der als Subviews, sie drehen sich nicht richtig, und somit seitwärts erscheinen. Dies wird nur im Simulator getestet. Hier ist ein kleiner Code für Sie:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    ShellTVC* viewA = [[ShellTVC alloc] initWithTitle:@"View A"];
    ShellTVC* viewB = [[ShellTVC alloc] initWithTitle:@"View B"];

    // The first subview added will rotate to landscape correctly. 
    // Any subsequent subview added will not.

    // You may try this by various commentings and rearranging of these two statements.

    [window addSubview:[viewA tableView]];
    [window addSubview:[viewB tableView]];

    [window makeKeyAndVisible];
}

ViewB erscheint seitwärts. Kommentieren Sie die addSubview für ViewB und ViewA richtig angezeigt wird. Tun Sie das für ViewA nur, und ViewB richtig angezeigt wird.

Ich schaffe nicht diese UITableViewControllers über NIBs, obwohl die UIWindow ist.

Falls Sie sich fragen, ShellTVC is-a UITableViewController und implementiert diese Methode:

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

Auch ich habe die UIInterfaceOrientation in der plist-Datei UIInterfaceOrientationLandscapeLeft gesetzt.

Wahrscheinlich bezogen - und unbeantwortet - SO Fragen hier und hier .

War es hilfreich?

Lösung

Ich glaube, mir einen Weg gefunden, - vielleicht den richtigen Weg - dies zu tun.

  1. Erstellen Sie eine „Master“ UIViewController Unterklasse, die shouldAutorotate ... implementiert, und fügen Sie diese als einzige Ansicht auf dem Fenster.
  2. , um zwischen dem ViewA oder ViewB, verwenden Sie die Kombination von dismissModalViewControllerAnimated: & PresentModalViewController: animated: auf diesen Master-View-Controller.

Hier ist ein Code:

// this doesn't really do much but implement shouldAutorotate...
@interface MasterViewController : UIViewController
@end

@implementation MasterViewController
- (BOOL) shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)interfaceOrientation {
     return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
@end

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    MasterViewController* masterVC;
    UIViewController* activeTVC;
    UIViewController* onDeckTVC;
}
@end

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    UIViewController* masterVC = [[MasterViewController alloc] init];        
    activeTVC = [[ShellTVC alloc] initWithTitle:@"View A"];
    onDeckTVC = [[ShellTVC alloc] initWithTitle:@"View B"];
    [window addSubview:masterView.view];
    [window makeKeyAndVisible];
    [masterVC presentModalViewController:activeTVC animated:NO];
}

// you would call this to toggle between "View A" and "View B"
- (void)toggleTVC {
    UITableViewController *hold = activeTVC;
    activeTVC = onDeckTVC;
    onDeckTVC = hold;
    [masterVC dismissModalViewControllerAnimated:NO];   
    [masterVC presentModalViewController:activeTVC animated:NO];
}

Warum funktioniert das?

  1. Alle Ausrichtung Änderungen fließen durch View-Controller, nicht Blick.

  2. Soweit ich das beurteilen kann, der erste Blick oder subview, dass Sie Ihre Fenster hinzufügen bekommt eine besondere Sauce. Wenn diese Ansicht, die einen View-Controller hat, Zahlen das Fenster, um es heraus.

Das heißt, zum ersten subview nur, können Sie diesen Codes denken:

[window addSubview:masterVC.view];

als so etwas wie dies zu tun (keine echte Methode!):

[window addSubview:masterVC.view withViewController:masterVC];

Ich verstehe nicht mehr davon als das. Ich finde die Tatsache, dass ich dies mit dem ersten subview tun können, aber nicht andere, höchst verwirrenden. Weitere Informationen zu begrüßen, und lassen Sie es mich wissen, ob dies Ihnen geholfen oder nicht.

Andere Tipps

Anscheinend, wenn Sie Ansicht als Kind Ansichten hinzufügen wird es korrekt gedreht werden. Dies ist nicht eine große Lösung für mein Projekt, aber es sieht aus wie es die einzige Lösung sein könnte.

Leider sind Ihre Subviews nur gefragt, was Orientierungen sie unterstützen, wenn eine Änderung der Orientierung stattfindet.

Also hat ich die Orientierung Einstellung am Ende, bevor ich die neuen View-Controller auf dem Stapel schieben, wenn es es geändert wissen:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait]; 

Ja, das ist ein nicht unterstützter Anruf.

Sie können die UIApplication Objekt verwenden, um ein bestimmtes Gerät Orientierung zu erzwingen.

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];

Ja, ich glaube, dieses Problem zu lösen, haben durch mehrere XIB mit. Ich erinnere mich an diese Lösung durch eine der Bücher zu sehen, die ich in der Vergangenheit lesen. Wenn nicht, haben Sie mit Übersetzung und Position des Objekts in der Ansicht spielen ... besser getrennte XIB haben.

Das sollte funktionieren.

- (void)viewDidLoad {
    if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) || 
        ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)) 

    {
        self.view.frame = CGRectMake(0, 0, 1024, 748);

    } else {
        self.view.frame = CGRectMake(0, 0, 768, 1004);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top