xcode 4.5 come scegliere gli storyboard al momento del lancio

Cercando di far funzionare la mia app sia con iPhone 5 che con iPhone 4 / 4s. Ho provato il “AutoLayout” ma non sembra funzionare per la mia app, leggo anche che non è supportato in iOS 5. AutoLayout in particolare non riesce su un controller di visualizzazione che ha un UIScrollview e un UIPicker che viene ridimensionato nel codice. Avere due Storyboard uno per 4 pollici e uno per 3,5 pollici sembra la strada da percorrere.

Il due album Storyboard sembra essere la soluzione per me. Quindi questo mi lascia con due domande;

  1. Dove dovrebbe essere il codice da rilevare se poi è un 4 / 4s / 5? Assumerei nell’appDelegate.m nel metodo didFinishLaunchingWithOptions

  2. Come posso cambiare lo “Storyboard principale”?

Questa è una grande domanda.

Quello che devi fare è,

  1. Seleziona il tuo storyboard 4 / 4s corrente, vai su File, duplica, poi dagli un nome specifico per iPhone 5. Assicurati che Target e il nome della tua app siano selezionati.

  2. Quindi devi selezionare le scene nello storyboard e in Impostazioni Attributi cambiare le dimensioni in Retina 4 Schermo intero. Questo ti permette di riorganizzare tutto per questo display.

  3. Finalmente in applicazione, FinishLaunchingWithOptions incolla il seguente codice con il nome dello storyboard che hai dato per lo storyboard da 4 pollici.

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ UIStoryboard *storyBoard; CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width * scale, result.height * scale); if(result.height == 1136){ storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_5" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } } return YES; } 

Se qualcuno non ottiene come eseguire il passaggio 1, fare come di seguito.

  1. Vai alla cartella Project e copia incolla MainStoryboard.storyboard e rinomina il nuovo storyboard per dire MainStoryboard5.storyboard .

  2. Aggiungi questo nuovo storyboard MainStoryboard5.storyboard nel progetto (in Xcode) facendo clic con il tasto destro su Project e facendo clic su Add Files to ....

  3. Ora abbiamo due storyboard in xcode.

Mancia

Potrebbe essere necessario utilizzare ‘Prodotto> Pulisci’ affinché funzioni correttamente dopo aver eseguito quanto sopra.

Attualmente l’unico modo è quello di verificare se si sta utilizzando l’iPhone 5 sia la [UIScreen mainScreen] bounds] che [[UIScreen mainScreen] scale] .

 BOOL isIphone5 = (([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) && (([UIScreen mainScreen].bounds.size.height * [[UIScreen mainScreen] scale]) >= 1136)); 

Funziona solo se hai almeno aggiunto [email protected] avvio [email protected] alla tua applicazione. Altrimenti questo restituirà sempre false. (Poiché lo schermo sarà in formato letterbox se non si dispone dell’immagine di avvio)

Per impostare lo storyboard sulla versione di iPhone 5, potresti dare un’occhiata a questa domanda

Ho preso spunto dalla risposta fields.cage e l’ho adattato al mio codice, funziona perfettamente. Grazie !!

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ UIStoryboard *storyBoard; CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width * scale, result.height * scale); if(result.height == 1136){ self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone5" bundle:nil] autorelease]; } else { self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease]; } } 

Quello che ho fatto di recente è aggiungere una dichiarazione define in tutte le classi che ho bisogno di controllare il dispositivo. Questo può essere fatto anche in qualsiasi file di intestazione globale.

 #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) 

Il test di bool è dallo schermo Detect iphone 5 4 ” .

 bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136)); if (isiPhone5) { // Setup For iPhone 5 Screen Size UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MyiPhone5StoryboardName" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } 

Funziona magnificamente se usi già gli storyboard e vuoi solo cambiare lo storyboard dai valori predefiniti con cui è stato avviato il tuo progetto per i dispositivi iPhone 5. Se stai partendo da zero con un progetto non Storyboard esistente, puoi farlo in questo modo.

 #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136)); if (isiPhone5) { // Load iPhone 5 Storyboard UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } else if (IS_IPAD) { // Load IPAD StoryBoard UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } else { // Load the iPhone 3.5" storyboard UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } 

Quando inizio un progetto, ora disegno la versione iPhone 3.5 “nello storyboard (se sto usando gli storyboard), poi quando ho finito con quel disegno vado nei miei file di progetto e trovo il file storyboard, dal momento che un file storyboard è solo un File di layout XML, posso prendere quel file e caricarlo nel mio editor di testo preferito e cambiare due tag.

Converti iPhone in iPad

  1. Nella parte superiore del file, trova targetRuntime="iOS.CocoaTouch
  2. Cambia in targetRuntime="iOS.CocoaTouch.iPad"
  3. Nella parte inferiore del file è ansible trovare questo
  4. Cambiare questo in

L’ultimo elemento verrà visualizzato solo se il file dello storyboard principale è configurato per lo schermo iPhone 4 “.

Ciò che è importante qui è che se aggiungi l’iPhone 5 solo a un progetto esistente hai solo bisogno del primo controllo per sovrascrivere il valore predefinito e caricare il tuo file storyboard speciale. Questo mi ha letteralmente salvato dal dover manualmente il layout di tutti gli oggetti nel codice per iPhone 5.

Il primo Funziona molto bene è semplice e chiaro, ma per tutti se vuoi integrare dispositivi multipli guarda qui:

  1. Crea un progetto per iPhone5 con uno Storyboard chiamato iPhone5_Storyboard.

  2. Chiudi l’app e all’interno di una cartella clona la Main Story chiamata iPhone5_Storyboard e rinominala in iPhone4_Storyboard senza dimenticare di modificare le dimensioni e riordinare tutti gli oggetti all’interno del builder dell’interfaccia xcode.

  3. Facoltativo se si desidera una versione universale, all’interno di xcode utilizzare Aggiungi file e aggiungere un nuovo target Storyboard EMPTY per iPad, ope un iphone5_storyboard utilizzare CMD + A e copiare tutto e incollare in Empty Story per iPad (è necessario riordinare l’object, ma è tutto collegato e lavorando).

  4. In Xcode sotto TARGET imposta Universal App e imposta sotto MainStoryboard l’iPhone5_Storyboard, sotto iPad Main Story, impostazione iPad_Storyboard.

  5. Ora GRAZIE ALLA PRIMA RISPOSTA DI QUESTO POST dobbiamo implementare tutte le storie diverse usando questo codice all’interno di AppDelegate.m :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ UIStoryboard *storyBoard; CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width *scale, result.height *scale); //----------------HERE WE SETUP FOR IPHONE4/4s/iPod---------------------- if(result.height == 960){ storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } //----------------HERE WE SETUP FOR IPHONE3/3s/iPod---------------------- if(result.height == 480){ storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } } return YES; } 

Adesso abbiamo un’app universale per iPhone 3 / 3Gs / 4 / 4s / 5 iPod (AllGen) iPad 1/2/3/4 Mini e Retina

Grazie ragazzi