uiviewcontroller - ¿Puedo usar dos xibs con un controlador de visualización? Re: portar a iPhone 5
iphone-5 (3)
Aquí hay un ejemplo de código de trabajo simple para su controlador de vista que muestra cómo cargar myXib-5.xib
en el iPhone 5 y myXib.xib
en iPhones / iPod anteriores al iPhone 5:
- (void)loadView
{
if([[UIScreen mainScreen] bounds].size.height == 568)
{
// iPhone 5
self.view = [[NSBundle mainBundle] loadNibNamed:@"myXib-5" owner:self options:nil][0];
}
else
{
self.view = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil][0];
}
}
Supone que solo está apuntando al iPhone y no al iPad, para hacerlo simple.
La propiedad de clase del propietario del archivo del XIB también debe establecerse en el controlador de vista que contiene loadView
.
Acabo de enviar mi primera aplicación a la tienda de aplicaciones (¡ sí, fue aprobada! ). Ahora quiero actualizarlo para que funcione (se vea mejor) en la pantalla más grande del iPhone 5. No pretendo cambiar nada más que cambiar el diseño un poco para la pantalla más grande.
NOTA: No quiero tener mi xib actual estirado.
¿Es posible crear dos archivos xib (es decir, copiar mi archivo xib actual para la pantalla principal) y engancharlos en el controlador de vista y tenerlos de modo que cuando la aplicación se inicie, la aplicación detecte si hay una pantalla de iPhone 5 o una pantalla anterior. Luego, dependiendo de qué dispositivo sea, muestre al usuario una pantalla diferente.
Pretendo que la aplicación subyacente siga siendo la misma. Todo lo que quiero es presentar una pantalla ligeramente diferente (más alta) para los usuarios del iPhone 5 con algunos botones / elementos movidos para el nuevo diseño. De lo contrario, no agregaré ni quitaré nada de la interfaz.
Esta pregunta / respuesta de SO muestra cómo cambiar entre una vista de iPhone o iPad. Así que a esta esta . Ambos son útiles, pero no sé cómo modificar esto para la circunstancia de que el usuario esté usando un iPhone 5 con una pantalla más grande o un iPhone 4S o menos. Además, suponen dos controladores de vista. Solo quiero un controlador de vista, ya que absolutamente NADA en la lógica del controlador de vista cambia, solo cambia la ubicación de los objetos en la pantalla y todo se hace en el XIB.
Debería pensar que la respuesta debería ser que el controlador de vista en sí mismo evalúa en qué dispositivo se está ejecutando y luego presenta el xib apropiado. ¿Sí? ¿No?
Si es así, ¿cómo voy a hacer esto?
El código en respuesta fue útil, pero necesitaba algo que funcionara mejor para aplicaciones universales (iphone / ipad).
En caso de que alguien más necesite lo mismo, aquí hay algo para que comiences.
Digamos que construiste una aplicación universal usando los estándares de nib / xib para ios para los controladores de vista que tienen xibs con el mismo nombre:
Los dos valores predeterminados incorporados para cargar automáticamente xibs cuando no se proporciona ningún nombre se pasan a initWithNibName:
- ExampleViewController.xib [predeterminado de iPhone cuando la punta se llama vacía para Retina 3.5 Pantalla completa para diseños clásicos iphone 4 / 4s, etc. ...]
- ExampleViewController ~ ipad.xib [ipad / ipad mini predeterminado cuando la punta se llama vacía]
Ahora supongamos que necesita xibs personalizadas para el iPhone 5 / 5s en IB con la opción Retina 4 Pantalla completa, es decir, no desea que se muestren los 3.5 xibs para dispositivos de 568h.
Aquí está la convención de nomenclatura personalizada que utiliza un enfoque de categoría:
- ExampleViewController-568h.xib [iphone no predeterminado / convención de nomenclatura personalizada cuando el nombre de la pluma está vacío para Retina 4 Pantalla completa (568h)]
En lugar de anular los valores predeterminados de nombres incorporados, use una categoría para ayudar a configurar el xib correcto para el controlador.
https://gist.github.com/scottvrosenthal/4945884
ExampleViewController.m
#import "UIViewController+AppCategories.h"
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
nibNameOrNil = [UIViewController nibNamedForDevice:@"ExampleViewController"];
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Do any additional customization
}
return self;
}
UIViewController + AppCategories.h
#import <UIKit/UIKit.h>
@interface UIViewController (AppCategories)
+ (NSString*)nibNamedForDevice:(NSString*)name;
@end
UIViewController + AppCategories.m
// ExampleViewController.xib [iphone default when nib named empty for Retina 3.5 Full Screen]
// ExampleViewController-568h.xib [iphone custom naming convention when nib named empty for Retina 4 Full Screen (568h)]
// ExampleViewController~ipad.xib [ipad/ipad mini default when nib named empty]
#import "UIViewController+AppCategories.h"
@implementation UIViewController (AppCategories)
+ (NSString*)nibNamedForDevice:(NSString*)name
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
if ([UIScreen mainScreen].bounds.size.height == 568)
{
//Check if there''s a path extension or not
if (name.pathExtension.length) {
name = [name stringByReplacingOccurrencesOfString: [NSString stringWithFormat:@".%@", name.pathExtension] withString: [NSString stringWithFormat:@"-568h.%@", name.pathExtension ]
];
} else {
name = [name stringByAppendingString:@"-568h"];
}
// if 568h nib is found
NSString *nibExists = [[NSBundle mainBundle] pathForResource:name ofType:@"nib"];
if (nibExists) {
return name;
}
}
}
// just default to ios universal app naming convention for xibs
return Nil;
}
@end
[Revisado con respuesta completa el: 7 de octubre de 2012]
Después de una investigación importante encontré la respuesta, en parte en esta página SO (que muestra cómo detectar en qué versión del iPhone se ejecuta su aplicación) y en parte esta página SO (que muestra cómo tener dos xib comparten el mismo "Propietario del archivo" . una pieza del rompecabezas (cargando xib''s separados a través del método loadNibNamed:) Encontré en el capítulo 10 del excelente texto de programación de iOS de The Big Nerd Ranch .
Cree un segundo xib (Archivo, Nuevo ..., Archivo, seleccione ''Interfaz de usuario'', seleccione ''Vacío'' y guárdelo. Esto crea el nuevo xib. En el ejemplo siguiente, mi clásico xib (para iPhones de 3.5 ") se llamó TipMainViewController.xib. Guardé el nuevo iPhone 5 xib con el nombre ''TipMainViewController-5.xib''
Haga que el nuevo ''propietario del archivo'' de xib sea el mismo ViewController que su xib existente. Para hacer esto, en el nuevo archivo xib, seleccione ''Propietarios del archivo''. Luego, en el "Inspector de identidad", seleccione el Controlador de vista existente como Clase personalizada. En mi caso, seleccioné ''TipMainViewController''.
Arrastre una nueva UIView en el lienzo vacío del nuevo xib. En el nuevo inspector de atributos de UIView, establezca el atributo ''Tamaño'' en ''Pantalla completa de Retina 4''
Seleccione todos los contenidos en el xib "Classic" 3.5 "existente, por ejemplo: todos sus controles, botones, selectores, etiquetas, etc. Cópielos y péguelos en el nuevo iPhone 5 xib. Cambie el tamaño / mueva, etc., para optimizarlos para el iPhone. Pantalla de 4 ".
Realice todas las conexiones hacia / desde el propietario del archivo como lo hizo cuando creó su xib original.
Finalmente, en el método ''viewDidLoad'' de su ''único'' ViewController, inserte la siguiente lógica (usando sus nombres de nib / xib por supuesto):
- (void)loadView { [super viewDidLoad]; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; if(result.height == 480) { // iPhone Classic [[NSBundle mainBundle] loadNibNamed:@"TipMainViewController" owner:self options:nil]; } if(result.height == 568) { // iPhone 5 [[NSBundle mainBundle] loadNibNamed:@"TipMainViewController-5" owner:self options:nil]; } } }