2011-10-14 9 views
5

Oggi ho iniziato a giocare con iOS 5 e ho visto che XCode 4.2 mi consente di selezionare iOS 5 come Base SDK ma non iOS 4.Cosa devo fare per adattare la mia app a iOS 5.0 mantenendo la compatibilità con iOS 4

Fino ad ora ho sovrascritto drawRect: metodo in UINavigationBar per personalizzare il suo aspetto ma iOS 5 non chiama più quel metodo. Ora devo usare [UINavigationBar appearance] per farlo (che penso sia molto meglio). Tuttavia, il metodo dell'aspetto è disponibile solo in iOS 5, quindi se lo utilizzo la mia app si blocca durante l'esecuzione su iOS 4. Cosa devo fare? Devo controllare la versione di iOS con macro in ogni posto in cui utilizzo un metodo iOS 5?

Grazie,

Ariel

risposta

16

La risposta alla prima domanda è: è necessario utilizzare iOS5 (o l'ultimo iOS SDK) come SDK di base, ma è possibile impostare la versione minima supportata iOS in Target di distribuzione. Lì puoi impostare iOS4.0 (o qualsiasi altra cosa tu voglia).

Il modo corretto per gestire la seconda domanda consiste nel testare la capacità , non nella versione. Quindi, qualcosa di simile avrebbe funzionato nel dire, il metodo di application:didFinishLaunchingWithOptions::

// iOS5-only to customize the nav bar appearance 
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) { 
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"]; 
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault]; 
} 

Verrà quindi compilando questo contro l'iOS5 SDK, quindi l'uso di appearance a tutti andrà bene. Ma quando questo codice compilato viene eseguito su una versione di iOS prima di 5, andrà bene.

Come detto prima, è possibile mantenere il codice drawRect: così com'è.

+0

'[[UINavigationBar class] respondsToSelector: @selector (appearance)]' può essere scritto come '[UINavigationBar respondsToSelector: @selector (appearance)]' – user102008

0

Si può mettere lo stesso pezzo di codice sia nella drawRect: che iOS 4 usi e il proxy restituito da [UINavigationBar aspetto]. Due percorsi di codice diversi.

0

Non è possibile eseguire questa operazione con macro poiché entrambi i percorsi di codice devono essere posizionati e la rotta corretta da percorrere dipende da un controllo di runtime.

Soooo ... usare qualcosa di simile:

NSString *os_version = [[UIDevice currentDevice] systemVersion]; 

per ottenere la versione di iOS si sta attualmente in esecuzione avanti e fare la [comparsa UINavigationBar] sotto 5 & più recente, e si può ripiegare al drawRect thing su iOS 4.

+0

Questa è una cattiva idea. Tecnicamente utilizzare la versione del sistema operativo funzionerà per la maggior parte dei casi, ma non è una soluzione solida. Diciamo che tintColor è stato aggiunto UIBarButtonItem in iOS 5, deprecato in iOS 6 e rimosso in iOS 7. Le app installate con la versione iOS 5 smetterebbero di funzionare correttamente nell'ipotetico iOS 7. Certo, potresti rilasciare aggiornamenti nel tempo che aggiungono condizioni aggiuntive e complessità, ma perché non usare solo - [respondsToSelector:] e non preoccuparti del passato O del futuro ?? –

3

Un altro modo per personalizzare l'intestazione è questo.

UIImage *image = [UIImage imageNamed:@"header.png"]; 

if([navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
    //iOS 5 new UINavigationBar custom background 
    [navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault]; 
} 
else{ 
    UIImageView *imgView = [[[UIImageView alloc] initWithImage:image] autorelease]; 
    [imgView setUserInteractionEnabled:NO]; 
    [imgView setTag:TOOLBAR_TAG]; 
    [navigationBar insertSubview:imgView atIndex:0]; 
} 

Utilizzando la respondsToSelector si può sapere se la funzione è qui.

0

Inoltre, puoi scaricare i simulatori 4.3 per iPhone e iPad. Quindi puoi arrestarti più rapidamente se utilizzi accidentalmente cose iOS 5 su 4.3 --Tom

+0

Sono utilizzati per supportare l'installazione di più SDK, ma suppongo che non ci sia più ora. –

Problemi correlati