Confía tu proyecto a un equipo profesional

  • - Gran experiencia en el desarrollo de aplicaciones para dispositivos móviles.
  • - Ocupamos los primeros puestos en el ranking de las diferentes Stores.
  • - Reconocidos y avalados por grandes clientes en multitud de proyectos.
  • - Empresa innovadora integrada por un equipo joven.


Reproducir sonidos en tu iPhone. Nivel Mojamuto.

Share


(Los fuentes del ejemplo están disponibles en el pie del artículo).

Después de haber tirado la toalla a la hora de intentar reproducir algún sonido del "sistema", he realizado un ejemplo reproduciendo un pequeño fichero de sonido con extensión CAF, AIF o WAV. Para nuestro ejemplo, vamos a reproducir un pequeño sonido cada vez que insertemos una fila a nuestro TableView.

CAF es la extensión que hace referencia a Core Audio Format, que es un formato de fichero utilizado para almacenar y manipular audio. Existen multitud de aplicaciones para la creación de este tipo de ficheros, así como para su conversión desde otros formatos.

1. PREPARAMOS EL FICHERO

Para ello, hago uso de un Wrapper ya existente y muy conocido llamado SoundEffect. Este wrapper, definido en su clase SoundEffect, tiene un manejo muy sencillo, ya que es una simple clase que dispone de los siguientes metodos:

C++:
  1. + (id)soundEffectWithContentsOfFile:(NSString *)aPath;
  2.  
  3. - (id)initWithContentsOfFile:(NSString *)path;
  4.  
  5. - (void)play;

El método principal de los anteriores es initWithContentsOfFile, el cual hace uso de la función AudioServicesCreateSystemSoundID, que prepara nuestro fichero de audio para ser reproducido con tan solo llamar al método play.

AudioServicesCreateSystemSoundID, tiene dos parámetros:

C++:
  1. OSStatus AudioServicesCreateSystemSoundID ( CFURLRef inFileURL, SystemSoundID *outSystemSoundID );

- inFileURL, es el fichero que más tarde vamos a reproducir.

- outSystemSoundID es el parámetro de salida con el fichero ya preparado.

 

2. REPRODUCIMOS EL FICHERO

Una vez creada nuestra clase SoundEffect, la cual utilizaremos para preparar nuestro fichero de audio, nos disponemos a crearnos un objeto de dicha clase en nuestra aplicación:

C++:
  1. NSBundle *mainBundle = [NSBundle mainBundle];
  2.  
  3. SoundEffect *clickSound = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"click" ofType:@"caf"]];

NSBundle, es el objeto que representa la localización del sistema de ficheros que agrupa código y recursos, el cual utilizaremos para localizar nuestros recursos y cargar el fichero click.caf.

Ahora tan solo nos queda llamar al método play que vimos anteriormente para ejecutar nuestro fichero de audio.

Descargar ejemplo: uitableviewsound.zip

 

Programar para Iphone desde tres. NSMutableArray. Nivel Luis Aragonés.

Share

Hoy juega España la final de la Eurocopa y publicar el nivel Luis Aragonés es nuestra forma de conmemorar este evento,

Hemos aprendido ya muchas cosas. En el ejemplo anterior aprendimos a adquirir datos, que el usuario insertaba en un formulario. Hoy vamos a aprender a guardar esos datos de manera permanente, es decir, creando array de datos y guardarlos en ficheros.

Empezamos:
Como este es el Artículo “Programar para Iphone desde Tres” me basaré en los anteriores, “desde Cero”, “desde Uno” y "desde Dos", y doy por sabidas las cosas expuestas en ellos.

Explicación del ejemplo:

Pretendo realizar un programa que sea como una agenda de contactos, que guarde el nombre, la dirección y el teléfono de mis amigos. Evidentemente pretendo poder añadir nuevos contactos y también eliminarlos. Por lo tanto, crearé en mi ventana, tres UITextField que me servirán tando para adquirir datos como para mostrar información. Y además pondré 4 botones, uno de añadir contacto, otro de borrar contacto, y otros dos de siguiente y anterior.

Creación del proyecto:

1.- Abrimos xcode.app y creamos un proyecto de tipo window.

Definición de Objetos y Acciones:

Como ya tenemos una cierta base ire al grano.

2.- En el archivo.h de nuestra app delegate, crearemos todos los Outlet y todas las Actions. Además necesitaré un NSMutableArray, que será la variable que guarde todos mis datos.

Antes de nada hay que hablar un poco del NSMutableArray. Se trata de un Array en el que en cada posición de su tabla interna de datos, puedes guardar cualquier tipo de objeto, es decir, en cada posición podría guardar un entero, o una cadena. En nuestro caso, en cada posición de nuestro NSMutableArray tendremos a otro NSMutableArray. Con esto logramos crear una especie de estructura. Este segundo Array tendrá tres cadenas, una para el nombre, otra para la dirección y otra la el teléfono.

C++:
  1. #import
  2. @class DATOSViewController;
  3.  
  4. @interface DATOSAppDelegate : NSObject
  5. {
  6. IBOutlet UIWindow *window;
  7.  
  8. IBOutlet id BOTON_SIGUIENTE;
  9. IBOutlet id BOTON_ANTERIOR;
  10. IBOutlet id BOTON_ANADIR;
  11. IBOutlet id BOTON_BORRAR;
  12.  
  13. IBOutlet id FORM_NOMBRE;
  14. IBOutlet id FORM_DIRECCION;
  15. IBOutlet id FORM_TELEFONO;
  16. NSMutableArray *DATOS;
  17.  
  18. NSString *NOMBRE;
  19. NSString *DIRECCION;
  20. NSString *TELEFONO;
  21.  
  22. NSUInteger INDICE;
  23. NSUInteger NUMERO_ELEMENTOS;
  24. }
  25. @property (nonatomic, retain) UIWindow *window;
  26.  
  27. - (IBAction) PULSAR_BOTON_SIGUIENTE: (id) sender;
  28. - (IBAction) PULSAR_BOTON_ANTERIOR: (id) sender;
  29. - (IBAction) PULSAR_BOTON_ANADIR: (id) sender;
  30. - (IBAction) PULSAR_BOTON_BORRAR: (id) sender;
  31. - (IBAction) CARGAR_DATOS: (NSUInteger) indice;
  32.  
  33. @end

Creación de interface y asignación de elementos:

3.- Ahora hacemos doble click sobre el archivo.xib para abrir y editar con el interface builder nuestra pantalla. Simplemente pongo la captura, ya que las vinculaciones ya las deberiais saber hacer.

Implementación de funciones:

Como ya lo tenemos todo vinculado, es hora de implementar nuestras funciones.

4.- Cerramos interface builder y nos vamos al Archivo.m. Allí escribiremos las funciones.

Como vamos a trabajar con ficheros, lo primero que tiene que hacer nuestra aplicación es cargar los datos del fichero para luego gestionarlos. El fichero se llamará: "datos.txt".

C++:
  1. - (void)applicationDidFinishLaunching:(UIApplication *)application
  2. {
  3. //Cargamos los datos del fichero.
  4. DATOS = [[NSMutableArray alloc] initWithContentsOfFile:@"datos.txt"];
  5. //    DATOS = [[NSMutableArray alloc] init]; Asi se inicializaria normal.
  6.  
  7. [window makeKeyAndVisible];
  8. [application setStatusBarHidden:YES animated:NO];//Oculta la status Bar
  9. NUMERO_ELEMENTOS = [DATOS count]; // inicializamos esta variable al numero de objetos en DATOS
  10. INDICE = 0;
  11. // ejecutamos el metodo CARGAR_DATOS
  12. [self CARGAR_DATOS:INDICE];
  13. }

Si compilaramos ahora mismo, aparecerían todos los elementos, e incluso podríamos rellenar datos en los UITextField, asi que ahora escribiremos el Método de Añadir (PULSAR_BOTON_ANADIR).

C++:
  1. - (IBAction) PULSAR_BOTON_ANADIR: (id) sender
  2. {
  3. NOMBRE =[FORM_NOMBRE text];
  4. DIRECCION =[FORM_DIRECCION text];
  5. TELEFONO =[FORM_TELEFONO text];
  6.  
  7. NSMutableArray *ESTRUC = [[NSMutableArray alloc] initWithObjects:NOMBRE,DIRECCION,TELEFONO,nil];
  8. [DATOS addObject:ESTRUC];
  9. [DATOS writeToFile:@"datos.txt" atomically:YES];
  10. NUMERO_ELEMENTOS = NUMERO_ELEMENTOS + 1;
  11. [FORM_TELEFONO resignFirstResponder]; //oculta teclado
  12. [FORM_DIRECCION resignFirstResponder];
  13. [FORM_NOMBRE resignFirstResponder];
  14. }

Tengo creadas tres variable globales, son tres cadenas, en las que introduciré los datos que haya en el momento de pulsar el botón en los UITextField (este paso no es necesario para hace al código más entendible). Seguidamente me creo un NSMutableArray local, que lo inicializo con las tres cadenas de antes. Es importante respetar el mismo orden de para la carga de datos. Primero nombre, después dirección y por último teléfono. Añado este NSMutableArray local, a nuestro NSMutableArray general, y además lo escribo en el fichero, sobreescribiendo. Y Actualizo la variable NUMERO_ELEMENTOS. Cada vez que pulse el botón se añadirá un elemento, aunque no haya cambiado los datos.

El método CARGAR_DATOS nos servirá para cambiar el texto de los UITextField e introducirles los datos que haya en la posición del NSMutableArray que indique INDICE. Hay que tener en cuenta que este método será de la siguiente manera:

C++:
  1. - (IBAction) CARGAR_DATOS: (NSUInteger) indice;
  2. {
  3. NSMutableArray *ESTRUC = [[NSMutableArray alloc] init];
  4. ESTRUC = [DATOS objectAtIndex:indice]; //devuelve el objeto de esa posición.
  5. [FORM_NOMBRE setText:[ESTRUC objectAtIndex:0]]; //respetamos el orden
  6. [FORM_DIRECCION setText:[ESTRUC objectAtIndex:1]];
  7. [FORM_TELEFONO setText:[ESTRUC objectAtIndex:2]];
  8. }

El resto del código no tiene ninguna complicación así que lo pondré tal cual.

C++:
  1. - (IBAction) PULSAR_BOTON_SIGUIENTE: (id) sender
  2. {
  3. if (INDICE == (NUMERO_ELEMENTOS - 1))
  4. {
  5. [self CARGAR_DATOS: INDICE];
  6. }
  7. else
  8. {
  9. INDICE = INDICE + 1;
  10. [self CARGAR_DATOS: INDICE];
  11. }
  12. }
  13. - (IBAction) PULSAR_BOTON_ANTERIOR: (id) sender
  14. {
  15. if (INDICE == 0)
  16. {
  17. [self CARGAR_DATOS: INDICE];
  18. }
  19. else
  20. {
  21. INDICE = INDICE - 1;
  22. [self CARGAR_DATOS: INDICE];
  23. }
  24. }
  25.  
  26. - (IBAction) PULSAR_BOTON_BORRAR: (id) sender
  27. {
  28. [DATOS removeObjectAtIndex:INDICE];
  29. NUMERO_ELEMENTOS = NUMERO_ELEMENTOS - 1;
  30. INDICE = INDICE - 1;
  31. [DATOS writeToFile:@"datos.txt" atomically:YES];
  32. [self CARGAR_DATOS:INDICE];
  33. }

5.- Compilamos y comprobamos el funcionamiento.

Ya se que las últimas tres funciones no las tengo explicadas, pero no deberiais tener problemas en entenderlas por vosotros mismo, ya que solo hay que relacionar conceptos ya adquiridos para saber que es lo que hacen.

Como siempre es conveniente que investigueis por vuestra cuenta y mejoreis el programa a vuestro estilo.

Otros Artículos de la serie:

Programar para Iphone desde cero. UIButton. Nivel Tarzán.

Programa para Iphone desde uno. UIView. Nivel Piolín.

Programar para Iphone desde dos. UITextField. Nivel Barragán.

Programar para Iphone desde cuatro. Controllers. Nivel Cantinflas.

SDK beta 8 y precios Telefónica.

Share

En faq-mac nos enteramos de la salida de la Beta 8 del SDK para Iphone. Nos enteramos que necesitaremos de Itunes 7.7 para trabajar con el Iphone. Pero resulta que Itunes 7.7 aun no está disponible. Por lo que únicamente podremos usar el simulador. Itunes 7.7 saldrá seguramente a la misma vez que el firmware 2.0 para Iphone e Ipod Touch. Por lo que no queda mucho. Quizás sería recomendable esperar a que este disponible Itunes 7.7 antes de instalar esta Beta 8.

También podemos leer en Applesfera los posibles precios que tendrá el Iphone es España. Serán 99 € para el de 8 GB y 199 € para el de 16 GB. Además el contrato mínimo será de 24 € al mes con una permanencia de 24 meses. Si hacemos cuentas vemos que al final de esos dos años, a parte del consumo telefónico que hagamos, que puede ser mayor o menos, tendremos que pagar 775 € para el de 16 GB. Si consideramos que por prepago en UK se podrá conseguir por cerca de 500 €, juzgar vosotros mismos. Eso si aquí también estaremos pagando el servicio 3G 128 kbps durante 2 años. ¿Realmente ese servicio vale 300 € para 2 años? Eso que cada uno haga su valoración.

Avanzar filas seleccionadas mediante código. Nivel Rompetechos.

Share

Fiel al foro, vuelve a servirme de inspiración para mostraros otro ejemplo que a un compañero y a mi personalmente nos ha resultado algo tedioso de solucionar, pero a base de buscar documentación y de alguna que otra prueba, hemos conseguido realizar.

El título del nivel Rompetechos en esta ocasión ha sido porque lo teníamos delante de nuestras narices y no veíamos la forma de hacerlo.

El ejemplo se basa en seleccionar filas de un UITableView mediante código, sin necesidad de seleccionarlas pulsando en la pantalla.

Para el ejemplo hemos mostrado un TableView en pantalla, y con un NavigationBar hemos insertado dos botones, uno para añadir filas a nuestra TableView y otro para avanzar de selección. Solo nos vamos a centrar en la opción de avanzar ya que el resto ha sido publicado en otras ocasiones y ya se da por sabido.

1. Nos definimos un miembro en nuestra clase controladora del TableView de tipo NSUInteger, el cual usaremos para guardar en todo momento la fila que vayamos seleccionando, y así aumentaremos o disminuiremos en función de si queremos avanzar o retroceder.

2. Tras la definición del botón de avanzar en nuestro NavigationBar, y de la acción que ejecutará tras ser pulsado, implementaremos el método para avanzar de selección de la siguiente manera:

C++:
  1. - (void)avanzar:(id)sender {
  2.  
  3. nRow = nRow+1; // Aumentamos para avanzar. Disminuimos para retroceder.
  4.  
  5. NSIndexPath *auxiliar = [[NSIndexPath alloc] initWithIndex:0]; // Inicializamos un índice
  6.  
  7. auxiliar = [auxiliar indexPathByAddingIndex:nRow]; // Aumentamos la posición del índice tantas filas como queramos.
  8.  
  9. [self.tableView selectRowAtIndexPath:auxiliar animated:NO scrollPosition:UITableViewScrollPositionNone];
  10.  
  11. }

De esta manera, seleccionamos una fila de nuestro TableView, con un índice que hemos inicializado y luego aumentado las posiciones que le indiquemos. Haremos lo mismo disminuyendo nRow para retroceder de fila.

No es de gran complejidad el ejemplo, pero seguro que a más de uno sirve.

Programar para Iphone desde dos. UITextField. Nivel Barragán.

Share

¿Cómo estamos?
Hoy, avanzaremos un poquito en nuestro aprendizaje. Una de las principales funciones que debe hacer un programa es la adquisición de datos, y para ello tenemos la clase UITextField. Se trata sin más de un simple formulario, que por defecto al ser pulsado con el dedo (recordemos que el Iphone tiene pantalla táctil) desplegará un teclado virtual en la parte inferior de la pantalla

Empezamos:
Como este es el Artículo “Programar para Iphone desde Dos” me basare en los anteriores, “desde Cero” y "desde Uno" ,y doy por sabidas las cosas expuestas en ellos.

Explicación del ejemplo:

Para poder entender bien como funciona separaré el programa en dos vistas que ocupen la pantalla completa. Cada vista contará de un Botón para ir hacia la otra vista, y además un UITextField. El TextField de la primera vista nos servirá para adquirir los datos, y en el segundo (aunque podriamos utilizar un UILabel) nos servirá para copiar los datos que hayan sido introducidos en la vista anterior.

Creación del proyecto:

1.- Abrimos xcode.app y creamos un proyecto de tipo window.

Definición de Objetos y Acciones:

Como ya tenemos una cierta base ire al grano.

2.- En el archivo.h de nuestra app delegate, crearemos todos los Outlet y todas las Actions. También será conveniente deshabilitar el UITextField de la segunda vista.

#import <UIKit/UIKit.h>
@class TEXTFIELD_BLOGViewController;
@interface TEXTFIELD_BLOGAppDelegate : NSObject <UIApplicationDelegate>
{
IBOutlet UIWindow *window;

IBOutlet id VISTA1;
IBOutlet id VISTA2;

IBOutlet id TEXTFIELD1;
IBOutlet id TEXTFIELD2;

IBOutlet id BOTON_F;
IBOutlet id BOTON_B;

NSString *cadena;
}
- (IBAction) PULSAR_ENTER_EN_TEXTFIELD1: (id) sender;
- (IBAction) PULSAR_BOTON_F: (id) sender;
- (IBAction) PULSAR_BOTON_B: (id) sender;
@property (nonatomic, retain) UIWindow *window;
@end

Creación de interface y asignación de elementos:

3.- Ahora hacemos doble click sobre el archivo.xib para abrir y editar con el interface builder nuestra pantalla.

Arrastramos dos UIView a la ventana de MainWindow.xib y las nombramos como VISTA1 y VISTA2. Hacemos doble click sobre ellas para editarlas, y a cada una de las vistas le añadimos un UIButton y un UITextField.

Ya tenemos todos nuestros elementos creados, y solo nos queda vincularlos con nuestra App Delegate. Pues bien, pulsando el Control desde nuestra app delegate vinculamos los dos botones, las dos vistas y los dos TextField a los correspondientes IBOutlet que creamos en el Archivo.h . Después de esto, pulsando el Control vinculamos los botones con la App Delegate, asignando las acciones de PULSAR_BOTON.

Hasta aquí nada nuevo, nada que no supieramos ya.

Si hicieramos lo mismo con el TEXTFIELD1 (el de la vista 1) asignariamos la IBAction al evento de pulsar sobre el TextField, pero nosotros queremos que cuando demos a la tecla ENTER del teclado virtual este se oculte. Por defecto, Xcode, establece que cuando pulsemos sobre el TextField se muestre el teclado automaticamente, es decir, esto no hace que lo implementemos. Sin embargo, una vez mostrado, si le damos al ENTER, este no se oculta, y eso si lo tenemos que implementar. Para ello en el interface builder abrimos la venta Inpector, seleccionamos el TextField de la vista uno y pulsamos sobre la pestaña de la flechita.

Nos aparece una lista de todos los eventos a los que les podemos asignar IBAction. En este caso, el que nos sirve a nuestro proposito es Did End On Exit. Pulsamos con el ratón sobre el circulito que esta a la derecha  de Did End On Exit (no hace falta tener pulsado control) y sin soltar el ratón vamos hasta nuestra App Delegate y le asignamos la IBAction PULSAR_ENTER_EN_TEXTFIELD1.

Implementación de funciones:

Como ya lo tenemos todo vinculado, es hora de implementar nuestras funciones.

4.- Cerramos interface builder y nos vamos al Archivo.m. Allí escribiremos las tres funciones:

- (void)applicationDidFinishLaunching:(UIApplication *)application

{
[window addSubview:VISTA1];
[TEXTFIELD2 setEnabled:NO];
[window makeKeyAndVisible];
}

- (IBAction) PULSAR_ENTER_EN_TEXTFIELD1: (id) sender
{
//    [VISTA1 removeFromSuperview];
//    [window addSubview:VISTA1];

[TEXTFIELD1 resignFirstResponder];
}

- (IBAction) PULSAR_BOTON_F: (id) sender
{
[VISTA1 removeFromSuperview];
[window addSubview:VISTA2];
//    cadena = [TEXTFIELD1 text];
[TEXTFIELD2 setText:[TEXTFIELD1 text]];

}
- (IBAction) PULSAR_BOTON_B: (id) sender
{
[VISTA2 removeFromSuperview];
[window addSubview:VISTA1];
}

Lo primero que hace nuestro programa como ya sabeis es ejecutar applicationDidFinishLaunching. Allí cargamos en la ventana la vista1 y desactivamos el TextField2 para que aunque sea pulsado no haga nada (esto lo podriamos haber hecho desde interface builder con el inspector).

La función PULSAR_BOTON2, simplemente cambia de la vista2 a la vista1. Y la función PULSAR_BOTON1. Además de cargar la de la vista1 a la vista2, cambia la propiedad Text del TEXTFIELD2, asignandole el valor que haya en ese momento en la propiedad Text del TEXTFIELD1.

Cuando ejecutamos PULSAR_ENTER_EN_TEXTFIELD1 hay dos maneras de lograr lo mismo, una es descargando y cargando la vista1, y la otra es ejecutar el método de UITextField :  [TEXTFIELD1 resignFirstResponder];   que lo que hace es desactivar el teclado.

5.- Compilamos y comprobamos el funcionamiento.

Tened en cuenta que la propiedad Text de un UITextField puede ser asignada a una cadena o a un array. Como he dicho al principio, la adquisición de datos es una parte esencial de cualquier programa.

Como siempre es conveniente que investigueis con la ventana inspector del interface builder las carácteristicas que puede tener un UITextField.

Otros Artículos de la serie:

Programar para Iphone desde cero. UIButton. Nivel Tarzán.

Programa para Iphone desde uno. UIView. Nivel Piolín.

Programar para Iphone desde tres. NSMutableArray. Nivel Luis Aragonés.

Programar para Iphone desde cuatro. Controllers. Nivel Cantinflas.

Impuestos sobre aplicaciones para Iphone.

Share

Si estas pensando en desarrollar aplicaciones para Iphone y luego venderlas a través de la App Store, deberías leer lo que dicen en Inside Iphone.

Nos hablan sobre los impuestos que hay que pagar en el caso de no ser ciudadano de los Estados Unidos. Normalmente Apple te descontará además del 30 % el porcentaje de impuestos que compute sobre nuestro 70 %. Pero claro, si no somos ciudadanos de Estados Unidos, estariamos pagando impuestos allí y luego también en nuestro pais de origen. Para evitar esto, tendriamos que imformar a Apple de esta circustancia. El documento que Apple nos pedirá para eximinos del pago de impuestos en USA es el EIN. Nos explican como solicitarlo en la web que he citado.

Mostrar nuestra aplicación en horizontal (apaisado). Nivel Risto.

Share

Tras una serie de comentarios que aparecieron en el foro, vi interesante escribir este artículo para explicar los pasos que tenemos que seguir para mostrar las vistas de nuestra aplicación en horizontal, independientemente de la posición y/o rotación de nuestro iPhone / iPod Touch.

Tan solo tenemos que seguir dos pasos:

1. Obligar a que nuestra aplicación muestre la orientación que nosotros queramos (derecha - izquierda) gracias a la clase UIDevice, independientemente de la posición y/o orienteación en la que nos encontremos.

2. Controlar en las vistas que queramos, mediante el método shouldAutorotateToInterfaceOrientation, que nuestra aplicación no se rote automáticamente cuando giremos nuestro dispositivo.

De esta forma, nuestra aplicación es cargada con una orientación fija y no dejaremos que se cambie automáticamente.

PASO A PASO

1. En nuestra clase delegada de nuestra aplicación, en el punto de entrada applicationDidFinishLaunching (podemos hacerlo en otro método que nosotros consideremos como punto de entrada), al final del mismo método, tras haber cargado las vistas necesarias en la ventana de nuestra aplicación, definiremos la orientación fija de la siguiente manera:

C++:
  1. - (void)applicationDidFinishLaunching:(UIApplication *)application {
  2.  
  3. ...
  4.  
  5. // Usaremos UIInterfaceOrientationLandscapeLeft o UIInterfaceOrientationLandscapeRight a nuestro gusto
  6.  
  7. [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft];
  8.  
  9. }

2. En todas y cada una de las clases que gestionan nuestras vistas ( en todas las que nosotros queramos, por supuesto ) tenemos que detectar cuando el dispositivo se gire e impedir que las vistas lo hagan cuando sea en vertical:

C++:
  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  2.  
  3. {
  4.  
  5. return (interfaceOrientation==UIInterfaceOrientationLandscapeLeft ||
  6.  
  7. interfaceOrientation==UIInterfaceOrientationLandscapeRight) ? YES : NO;
  8.  
  9. }