2012-09-21 20 views
19

iPhone 5 rilasciato, con nuove dimensioni e risoluzione dello schermo.Immagini per display retina iphone 5

Quando abbiamo utilizzato le immagini per iPhone 4 (retina), abbiamo aggiunto "@ 2x" al nome dell'immagine. Qualcuno può dirmi, è possibile aggiungere diverse immagini (sfondi, pulsanti, ecc.) Per il nuovo schermo di iPhone?

E la seconda domanda: posso avere nella mia app file XIB separati: per iPhone vecchio, iPhone nuovo (come per iPhone e iPad)?

Grazie!

+1

È necessario separare diverse domande in diverse domande. –

risposta

50

Ecco un eccezione dal mio blog su questo argomento

[UIImage imageNamed:] carica automaticamente @ versioni 2x delle immagini durante l'esecuzione su un dispositivo retina. Sfortunatamente, imageNamed: NON caricherà automaticamente -568h @ 2x versioni di immagini quando è in esecuzione su un iPhone 5.

A volte questo non importa, ad esempio le icone e la grafica non a schermo intero sono probabilmente le stesse su iPhone 4 & 5. Tuttavia, se si dispone di immagini di sfondo a schermo intero o di immagini di sfondo a larghezza intera/altezza per barre degli strumenti, ecc. Si avranno problemi. Molto probabilmente le tue immagini a 480 immagini si allungheranno (e probabilmente avranno un aspetto orribile come risultato).

È possibile controllare manualmente le dimensioni dello schermo e caricare l'immagine a destra in questo modo:

UIImage* myImage; 
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; 
if ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f) { 
    myImage = [UIImage imageNamed:@"myImage-568h.png"]; 
} else { 
    myImage = [UIImage imageNamed:@"myImage.png"]; 
} 

C'è un modo di alterare UIImage imageNamed quindi non carica automaticamente l'immagine a destra. Vedi il collegamento sotto per i dettagli.

Altro: http://pervasivecode.blogspot.co.uk/2012/09/making-apps-work-on-iphone-5-screen-size.html

EDIT: @Sound Blaster & @GrizzlyNetch sono destra, nel codice è necessario utilizzare imageNamed: @ "myImage-568h.png"], ma il nome del file effettivo dovrebbe essere [email protected] Se non lo fai, allora la scala non è corretta, proprio come hanno detto.

+2

Penso che il nome dell'immagine giusta sia 'myImage-568h.png' - senza @ 2x –

+2

Un'altra soluzione può essere trovata qui http://angelolloqui.com/blog/20-iPhone5-568h-image-loading –

+1

2Ben: Sono d'accordo con Sound Blaster, il suffisso @ 2x non dovrebbe essere lì. È perché chiamarlo con il suffisso non inizializza la scala dell'immagine corretta per la retina display (imageNamed controlla se c'è un file con suffisso e se ce n'è uno, carica immagine da file e imposta scale = 2). Prova ad eseguire NSLog (@ "% f", [UIImage imageNamed: "Default.png"]. Scale); e NSLog (@ "% f", [UIImage imageNamed: @ "[email protected]"]. scale) sul dispositivo/simulatore di retina e dovresti vedere i risultati. – JakubKnejzlik

11

L'iPhone 5 non introduce una nuova densità di pixel in modo da poter utilizzare solo tutte le immagini retina utilizzate in precedenza.

Tutto ciò che serve per supportare la nuova risoluzione dell'iPhone 5 è quello di farvi vedere le viste sulla finestra. Per la maggior parte delle visualizzazioni, come tableview e scrollview, questo non presenterà alcun problema.

Inoltre non è necessario aggiungere altri file XIB per la nuova risoluzione, che non è supportata.

basta aggiungere il [email protected] a voi app pacchetto per rendere iOS 6 si fanno app prende lo spazio supplementare disponibile in iPhone 5.

Tutti i controlli nativi, come la barra delle schede si comporterà come ci si aspetterebbe.

Se si desidera supportare iOS4.3 e 5. * nell'app, assicurarsi che l'impostazione Use Autolayout nell'impostazione del pennino (prima scheda nel generatore di interfacce) sia disattivata.

quindi assicuratevi di installare correttamente la vista autoresizingMask

1

if ([UIScreen mainScreen].scale == 2.f & & screenHeight == 568.0f) I confronti esatti di numeri in virgola mobile non sono una buona idea in nessuna lingua a causa di errori di arrotondamento nel modo in cui sono memorizzati in memoria. Ad esempio, non è possibile garantire che 568.0f non sia archiviato come 567.9999999 o 568.0000001. Molto più sicuro usare un intervallo, o in questo caso sarebbe sufficiente screenHeight> 567.1f. Sospetto che persino l'iPhone non supporti fisicamente le frazioni di pixel.

+1

Ma fortunatamente nella pratica le cose non sono così strane come le stai facendo. Se si utilizza lo stesso compilatore sulla stessa piattaforma, sono praticamente sicuro che il 568.0 sia lo stesso in tutte le rappresentazioni purché non derivi da varie altre operazioni. Pensaci, da qualche parte in memoria l'altezza di iPhone viene dichiarata e restituita alla tua app. Lì in memoria mettono 568.0 e poi lo si confronta con 568.0. Usano XCode/GCC, si usa la stessa cosa, quindi come potrebbe lo stesso compilatore mettere bit diversi lì? – RelativeGames

0

Sono attualmente rilevando se il dispositivo corrente è un 4" iPhone questo modo e funziona benissimo. hth

- (BOOL)isiPhone5{ 
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568.0); 
} 
1

EDIT

attenzione, come di iOS 8 UIScreen tener conto dell'orientamento (controllare l'altezza può restituire due valori, l'altezza verticale o l'altezza orizzontale, prima era solo l'altezza verticale), ma xcassets è meglio è possibile controllarlo qui: How to addapt iphone background?

END EDIT

In base alla risposta Ben Clayton ho creato una categoria utile per gestire l'immagine per iPhone 5. Grazie.

+ (UIImage *) imageForName:(NSString *)imageName 
{ 
    NSString *result = imageName; 

    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; 
    BOOL isIphoneFive = ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f); 

    if (isIphoneFive) 
    { 
     NSString *imageNameWithoutExtension = [imageName stringByDeletingPathExtension]; 
     NSString *extension = [imageName pathExtension]; 

     result = [NSString stringWithFormat:@"%@-568h.%@",imageNameWithoutExtension, extension]; 
    } 

    return [UIImage imageNamed:result]; 
} 
Problemi correlati