2011-10-14 12 views
5

Empecé a jugar con iOS 5 hoy y he visto que XCode 4.2 solo me permite seleccionar iOS 5 como SDK base pero no iOS 4.Qué debo hacer para adaptar mi aplicación a iOS 5.0 manteniendo la compatibilidad con iOS 4

Hasta ahora he sobrescrito el método drawRect: en UINavigationBar para personalizar su apariencia, pero iOS 5 ya no llama a ese método. Ahora tengo que usar [apariencia UINavigationBar] para hacerlo (que creo que es mucho mejor). Sin embargo, el método de apariencia solo está disponible en iOS 5, así que si lo uso mi aplicación se bloquea al ejecutar en iOS 4. ¿Qué debo hacer? ¿Tengo que verificar la versión de iOS con macros en todos los lugares en los que utilizo un método iOS 5?

Gracias,

Ariel

Respuesta

16

La respuesta a su primera pregunta es: debe usar iOS5 (o el último SDK de iOS) como su SDK base, pero debe configurar su versión de iOS mínima compatible en Destino de despliegue. Allí puedes configurar iOS4.0 (o lo que quieras).

La forma correcta de resolver su segunda pregunta es probar capacidad, no la versión. Por lo tanto, algo como esto funcionaría en, por ejemplo, el método de 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]; 
} 

A continuación se le compilando esto contra el SDK IOS5, por lo que el uso de appearance del todo va a estar bien. Pero cuando este código compilado se ejecute en una versión de iOS anterior a 5, estará bien.

Como dije antes, puede conservar su código drawRect: tal como está.

+0

'[[clase UINavigationBar] respondsToSelector: @selector (apariencia)]' se puede escribir como '[UINavigationBar respondsToSelector: @selector (apariencia)]' – user102008

0

Usted puede poner la misma pieza de código, tanto en el drawRect: que el IOS 4 usos y el proxy devuelto por [apariencia UINavigationBar]. Dos rutas de código diferentes.

0

No puede hacer esto con las macros, ya que ambas rutas de código deben estar en su lugar y la ruta correcta depende de una comprobación en tiempo de ejecución.

Muchíiiiiiiiiisimo ... usar algo como esto:

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

para obtener la versión de IOS que actualmente está ejecutando en y hacer el [aspecto UINavigationBar] menores de 5 años & nuevo, y se puede caer de nuevo a la cosa drawRect en iOS 4.

+0

Esto es una mala idea. Técnicamente, la versión del sistema operativo funcionará en la mayoría de los casos, pero no es una solución sólida. Digamos que tintColor se agrega UIBarButtonItem en iOS 5, obsoleto en iOS 6 y eliminado en iOS 7. Las aplicaciones instaladas con la versión de iOS 5 dejarían de funcionar correctamente en el hipotético iOS 7. Seguro, podría lanzar actualizaciones con el tiempo que agreguen condiciones adicionales y complejidad, pero ¿por qué no usar - [respondsToSelector:] y no preocuparse por el pasado O el futuro? –

3

Otra forma de personalizar su encabezado es así.

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]; 
} 

Utilizando el respondsToSelector se puede saber si la función está aquí.

0

Aproveche también la descarga de los simuladores 4.3 para iPhone y iPad. Entonces puedes colgar más rápido cuando accidentalmente usas iOS 5 cosas en 4.3 --Tom

+0

Solían admitir tener instalados varios SDK, pero supongo que eso ya pasó. –

Cuestiones relacionadas