plus - Aplicaciones de iOS 6: ¿cómo lidiar con el tamaño de pantalla del iPhone 5?
iphone se (8)
Posible duplicado:
¿Cómo desarrollar o migrar aplicaciones para la resolución de pantalla del iPhone 5?
Me preguntaba cómo deberíamos lidiar con el tamaño de pantalla más grande del iPhone 5.
Como tiene más píxeles en altura, cosas como GCRectMake que usan coordenadas (y solo duplicaron los píxeles con el problema de retina / no retina) no funcionarán a la perfección entre las versiones, como sucedió cuando obtuvimos la Retina .
¿Y tendremos que diseñar dos guiones gráficos, al igual que para el iPad?
Personalmente, no creo que Apple requiera que compruebes el tamaño de la pantalla cada vez que tienes que dibujar algo, como dicen muchas respuestas. ¿Eso pasa con el iPad?
Como tiene más píxeles en altura, cosas como GCRectMake que usan coordenadas no funcionarán a la perfección entre las versiones, como sucedió cuando obtuvimos la Retina.
Bueno, funcionan igual con las pantallas Retina: es solo que 1 unidad en el sistema de coordenadas CoreGraphics se corresponderá con 2 píxeles físicos, pero no tienes / no tienes que hacer nada, la lógica sigue siendo la misma. (¿Alguna vez ha intentado ejecutar una de sus aplicaciones sin retina en un iPhone con retina ? )
Para la pregunta real: es por eso que no debes usar CGRectMakes y co explícitos ... Es por eso que tienes cosas como [[UIScreen mainScreen] applicationFrame]
.
Acabo de terminar de actualizar y enviar una versión de iOS 6.0 de una de mis aplicaciones a la tienda. Esta versión es compatible con iOS 5.0, por lo que mantuve el método shouldAutorotateToInterfaceOrientation:
y agregué los nuevos que se enumeran a continuación.
Tuve que hacer lo siguiente:
La autorotación está cambiando en iOS 6. En iOS 6, el método shouldAutorotateToInterfaceOrientation:
de UIViewController está en desuso. En su lugar, debe utilizar los métodos shouldAutorotate
supportedInterfaceOrientationsForWindow:
y shouldAutorotate
. Por lo tanto, agregué estos nuevos métodos (y mantuve el antiguo para compatibilidad con iOS 5):
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- Usé el método
viewWillLayoutSubviews
del controlador deviewWillLayoutSubviews
y ajustamos el diseño utilizando el rectángulo de los límites de la vista. - Controladores de vista modal:
willRotateToInterfaceOrientation:duration:
willAnimateRotationToInterfaceOrientation:duration:
y
didRotateFromInterfaceOrientation:
métodos ya no se llaman en ningún controlador de vista que realiza una presentación en pantalla completa sobre
sí mismo —por ejemplo,presentViewController:animated:completion:
- Luego arreglé el autolayout para las vistas que lo necesitaran.
- Las imágenes copiadas del simulador para la vista de inicio y las vistas de la tienda de iTunes en PhotoShop y las exportaron como archivos png.
- El nombre de la imagen predeterminada es:
[email protected]
y el tamaño es 640 × 1136. También se permite suministrar 640 × 1096 para el mismo modo de retrato (barra de estado eliminada). Tamaños similares también pueden suministrarse en modo horizontal si su aplicación solo permite la orientación horizontal en el iPhone. - He eliminado la compatibilidad con versiones anteriores para iOS 4. El motivo principal es que se ha eliminado el soporte para el código
armv6
. Por lo tanto, todos los dispositivos que puedo admitir ahora (ejecutandoarmv7
) se pueden actualizar a iOS 5. - También soy código de generación de armv7s para soportar el iPhone 5 y, por lo tanto, no puedo usar ningún framework de terceros (como Admob, etc.) hasta que se actualicen.
Eso fue todo, pero solo recuerde probar la autorotación en iOS 5 y iOS 6 debido a los cambios en la rotación.
Creo que puedes usar [UIScreen mainScreen].bounds.size.height
y calcular el paso para tus objetos. Cuando calculas el paso puedes establecer coordenadas para dos resoluciones.
O puede obtener la altura como arriba y if(iphone5) then... else if(iphone4) then... else if(ipad)
. Algo como esto.
Si utilizas guiones gráficos, debes crear un nuevo iPhone, creo.
Debe agregar una imagen PNG 640x1136 píxeles ( [email protected]
) como imagen de [email protected]
predeterminada de 4 pulgadas de su proyecto, y usará espacios adicionales (sin esfuerzos en aplicaciones basadas en tablas simples, los juegos requerirán más esfuerzos) .
He creado una pequeña categoría de UIDevice para tratar con todas las resoluciones de pantalla. Puedes obtenerlo aquí , pero el código es el siguiente:
Archivo UIDevice + Resoluciones.h :
enum {
UIDeviceResolution_Unknown = 0,
UIDeviceResolution_iPhoneStandard = 1, // iPhone 1,3,3GS Standard Display (320x480px)
UIDeviceResolution_iPhoneRetina4 = 2, // iPhone 4,4S Retina Display 3.5" (640x960px)
UIDeviceResolution_iPhoneRetina5 = 3, // iPhone 5 Retina Display 4" (640x1136px)
UIDeviceResolution_iPadStandard = 4, // iPad 1,2,mini Standard Display (1024x768px)
UIDeviceResolution_iPadRetina = 5 // iPad 3 Retina Display (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;
@interface UIDevice (Resolutions)
- (UIDeviceResolution)resolution;
NSString *NSStringFromResolution(UIDeviceResolution resolution);
@end
Archivo UIDevice + Resoluciones.m :
#import "UIDevice+Resolutions.h"
@implementation UIDevice (Resolutions)
- (UIDeviceResolution)resolution
{
UIDeviceResolution resolution = UIDeviceResolution_Unknown;
UIScreen *mainScreen = [UIScreen mainScreen];
CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
if (scale == 2.0f) {
if (pixelHeight == 960.0f)
resolution = UIDeviceResolution_iPhoneRetina4;
else if (pixelHeight == 1136.0f)
resolution = UIDeviceResolution_iPhoneRetina5;
} else if (scale == 1.0f && pixelHeight == 480.0f)
resolution = UIDeviceResolution_iPhoneStandard;
} else {
if (scale == 2.0f && pixelHeight == 2048.0f) {
resolution = UIDeviceResolution_iPadRetina;
} else if (scale == 1.0f && pixelHeight == 1024.0f) {
resolution = UIDeviceResolution_iPadStandard;
}
}
return resolution;
}
@end
Así es como necesitas usar este código.
1) Agregue los archivos UIDevice + Resolutions.h & UIDevice + Resolutions.m a su proyecto
2) Agregue la línea #import "UIDevice + Resolutions.h" a su ViewController.m
3) Agregue este código para verificar con qué versiones del dispositivo está tratando
int valueDevice = [[UIDevice currentDevice] resolution];
NSLog(@"valueDevice: %d ...", valueDevice);
if (valueDevice == 0)
{
//unknow device - you got me!
}
else if (valueDevice == 1)
{
//standard iphone 3GS and lower
}
else if (valueDevice == 2)
{
//iphone 4 & 4S
}
else if (valueDevice == 3)
{
//iphone 5
}
else if (valueDevice == 4)
{
//ipad 2
}
else if (valueDevice == 5)
{
//ipad 3 - retina display
}
El comentario de @ Pascal sobre la pregunta del OP es correcto. Simplemente agregando la imagen, elimina los bordes negros y la aplicación utilizará la altura completa.
Deberá realizar ajustes en cualquier CGRects al determinar que el dispositivo está utilizando la pantalla más grande. Es decir, si necesitas algo alineado con la parte inferior de la pantalla.
Estoy seguro de que hay un método incorporado, pero no he visto nada y mucho está aún bajo NDA, por lo que el método que utilizamos en nuestras aplicaciones es simplemente una función global. Agregue lo siguiente a su archivo .pch y luego es un simple if( is4InchRetina() ) { ... }
llame para hacer ajustes a sus CGRects, etc.
static BOOL is4InchRetina()
{
if (![UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 548 || [UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 568)
return YES;
return NO;
}
No.
if ([[UIScreen mainScreen] bounds].size.height > 960)
en el iPhone 5 está mal
if ([[UIScreen mainScreen] bounds].size.height == 568)
Todas las aplicaciones continuarán funcionando en la pantalla extendida verticalmente de lo que pude ver en la presentación de hoy. Se colocarán en forma de buzón o, básicamente, los 88 puntos adicionales de altura serían simplemente negros.
Si solo piensa admitir iOS 6+, entonces definitivamente considere usar el diseño automático. Elimina todo el manejo de diseño fijo y, en cambio, utiliza restricciones para diseñar cosas. Nada será difícil de codificar, y tu vida se volverá mucho más simple.
Sin embargo, si tiene que admitir iOS más antiguos, entonces realmente depende de su aplicación. La mayoría de las aplicaciones que usan una barra de navegación estándar y / o la barra de pestañas podrían simplemente expandir el contenido en el medio para usar esos puntos adicionales. Establezca la máscara de tamaño automático del contenido del centro para expandir en ambas direcciones.
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Sin embargo, si las aplicaciones usan un diseño de píxeles perfectos para mostrar contenido, funciona de manera ideal para las vistas de tablas, entonces lo mejor sería volver a imaginar el contenido para que pueda adaptarse a diferentes alturas.
Si eso no es una posibilidad, entonces la única opción restante es tener dos IU (pre iPhone 5 y iPhone 5).
Si eso suena feo, entonces podrías ir con el modelo de buzón predeterminado en el que los puntos / píxeles adicionales solo aparecen en negro.
Editar
Para que sus aplicaciones funcionen con el iPhone 5, debe agregar una versión retina de la imagen del iniciador. Debería llamarse [email protected]
. Y tiene que ser de calidad de retina, no hay compatibilidad con versiones anteriores aquí :)
También puede seleccionar esta imagen desde Xcode. Vaya al objetivo y, en la sección Resumen, busque Imágenes de lanzamiento. La imagen debe tener un tamaño de 640x1136 píxeles. Aquí hay una captura de pantalla de dónde encontrarla, si eso ayuda.
@interface UIDevice (Screen)
typedef enum
{
iPhone = 1 << 1,
iPhoneRetina = 1 << 2,
iPhone5 = 1 << 3,
iPad = 1 << 4,
iPadRetina = 1 << 5
} DeviceType;
+ (DeviceType)deviceType;
@end
.metro
#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)
+ (DeviceType)deviceType
{
DeviceType thisDevice = 0;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
{
thisDevice |= iPhone;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
thisDevice |= iPhoneRetina;
if ([[UIScreen mainScreen] bounds].size.height == 568)
thisDevice |= iPhone5;
}
}
else
{
thisDevice |= iPad;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
thisDevice |= iPadRetina;
}
return thisDevice;
}
@end
De esta manera, si desea detectar si es solo un iPhone o iPad (independientemente del tamaño de la pantalla), solo use:
if ([UIDevice deviceType] & iPhone)
o
if ([UIDevice deviceType] & iPad)
Si desea detectar solo el iPhone 5, puede usar
if ([UIDevice deviceType] & iPhone5)
A diferencia de la respuesta de Malcom, debería comprobar si es un iPhone.
if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes ||
[UIDevice currentResolution] == UIDevice_iPhoneStandardRes ||
[UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
Ninguna de las dos formas tiene una gran ventaja sobre la otra, es solo una preferencia personal.