2012-10-02 7 views
27

Tak jak aplikacja wykorzystuje różne storyboardy na iPada i iPhone'a, chciałbym, aby moja aplikacja używała innego scenorysu dla iPhone'a 5. Ponieważ nie ma opcji w Info.plist, aby wybrać domyślny scenopis dla iPhone'a 5, jak bym to zrobił programowo wywołać storyboard?Jak przejść do różnych scen na iPhone 5?

Nie chcę używać AutoLayout dla tej aplikacji, chyba że jest to absolutnie ostatnia deska ratunku. Rozumiem, jak wykryć, czy użytkownik używa iPhone'a 5 lub innego urządzenia o tym samym rozmiarze ekranu. Po prostu muszę wiedzieć, jak ustawić domyślny storyboard bez plist.

Odpowiedz

55

szukałem tej samej pary odpowiedź tygodni temu oto moje rozwiązanie nadzieja pomaga ..

-(void)initializeStoryBoardBasedOnScreenSize { 

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) 
{ // The iOS device = iPhone or iPod Touch 


    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size; 

    if (iOSDeviceScreenSize.height == 480) 
    { // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured) 

     // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone35 
     UIStoryboard *iPhone35Storyboard = [UIStoryboard storyboardWithName:@"Storyboard_iPhone35" bundle:nil]; 

     // Instantiate the initial view controller object from the storyboard 
     UIViewController *initialViewController = [iPhone35Storyboard instantiateInitialViewController]; 

     // Instantiate a UIWindow object and initialize it with the screen size of the iOS device 
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

     // Set the initial view controller to be the root view controller of the window object 
     self.window.rootViewController = initialViewController; 

     // Set the window object to be the key window and show it 
     [self.window makeKeyAndVisible]; 
    } 

    if (iOSDeviceScreenSize.height == 568) 
    { // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured) 

     // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4 
     UIStoryboard *iPhone4Storyboard = [UIStoryboard storyboardWithName:@"Storyboard_iPhone4" bundle:nil]; 

     // Instantiate the initial view controller object from the storyboard 
     UIViewController *initialViewController = [iPhone4Storyboard instantiateInitialViewController]; 

     // Instantiate a UIWindow object and initialize it with the screen size of the iOS device 
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

     // Set the initial view controller to be the root view controller of the window object 
     self.window.rootViewController = initialViewController; 

     // Set the window object to be the key window and show it 
     [self.window makeKeyAndVisible]; 
    } 

    } else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) 

    { // The iOS device = iPad 

    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 
    UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
    splitViewController.delegate = (id)navigationController.topViewController; 

    } 
} 

wywołanie tej metody pod AppDelegate ddiFinishLaunchingWithOptions: metoda I też nie pamiętam nazwy swoich storyboardy prawidłowo

Nadzieja pomaga ...

+0

Dziękujemy! Spędziłem zbyt dużo czasu szukając tej dokładnej odpowiedzi. Problem się nasilił! – user1486548

+1

Cieszę się, że zadziałało ... – lionserdar

+0

Metoda kompiluje się dobrze, ale nie wydaje się, aby cokolwiek robiłem po mojej stronie. Jakieś pomysły? – Klinetel

4

ten pracował dla mnie - nieznaczne udoskonalenie z opakowania uzyskanie ujęć w funkcji

-(UIStoryboard*) getStoryboard { 
    UIStoryboard *storyBoard = nil; 
    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {   
     storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; 
    }else{ 
     if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone){ 
      // The iOS device = iPhone or iPod Touch 
      CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size; 
      if (iOSDeviceScreenSize.height == 480){ 
       // iPhone 3/4x 
       storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_4" bundle:nil]; 

      }else if (iOSDeviceScreenSize.height == 568){ 
       // iPhone 5 etc 
       storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_5" bundle:nil]; 
      } 
     } 
    } 

    ASSERT(storyBoard); 
    return storyBoard; 
} 

UIStoryboard* mainStoryBoard = [self getStoryboard]; 
    self.initialViewController = [mainStoryBoard instantiateInitialViewController]; 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.rootViewController = self.initialViewController; 
    [self.window makeKeyAndVisible]; 
+0

dlaczego ASSERT (storyboard)? –

+0

tylko sprawdzenie stanu psychicznego, że istnieje scenopis. Makro ASSERT powinno być bez op w wersji wydania – gheese

+0

aha ... Nigdy tak naprawdę go nie używałem, więc nie byłem pewien. dostaję teraz kontekst ... jakieś polecane samouczki dotyczące ich używania? –