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. }

  • Buy Cheapest new fat binding weight loss pill Now Best Prices. Discount Online Pharmacy.
  • Buy Cheapest medco pharmacy Online Drugs, Health And Beauty. Best Prices.
  • Buy Cheap cialis europe Online Cheap Online Pharmacy. Online Medical Shop.
  • Buy Cheap weight loss medication Now Pharmacy Store. Pharmacy At The Best Price!
  • Buy Cheapest prescribed weight loss pills Now Cheap Prescription Drugs. Pharmacy Store.
  • Buy Cheapest adult acne Online Cheap Online Pharmacy. Best Online.
  • Buy Cheap where to order fioricet with codeine Now Free Viagra Pills! Drugs, Health And Beauty.
  • Buy Cheapest uk drug prices Now Guaranteed Shipping. Pharmacy Store.
  • Buy Cheapest otc weight loss supplements Online Best Internet. Free Viagra Pills!
  • Buy Cheapest diabetic impotence Online Cheap Online Pharmacy. Best Drugstore.
  • Buy Cheapest pills for bipolar disorder Now Best Drugstore. 24/Online Pharmacy.
  • Buy Cheapest valtrex commercials Now WorldWide Shipping. No Prescription Needed.
  • Buy Cheap online pharmacy no prescriptions Now Best Prices. 100% Satisfaction Guaranteed.
  • usa discount pharmacy Online Without Prescription Low Prices. Free Viagra Pills!
  • Buy Cheap buy cheap alprazolam Online WorldWide Shipping. Buy Medications Online.
  • Buy Cheapest phentermine no perscription Online Pharmacy Store. Guaranteed Shipping.
  • Buy Cheap doctor diet pills Online Pharmacy Store. Cheap Online Pharmacy.
  • Buy Cheapest pay pal buy diflucan Now Pharmacy At The Best Price! Low Prices.
  • Buy Cheapest effects nexium Now Online Medical Shop. Guaranteed Shipping.
  • Buy Cheap levitra use Now Free Viagra Pills! Buy Medications Online.
  • Buy Cheap online pain doctors Now Online Prices For online pain doctors! Top Online Pharmacy.
  • Buy Cheap rapid weight loss pills Online The Largest Internet Pharmacy. Best Online.
  • Buy Cheapest buy ativan from europe Online Best Prices. Buy Medications Online.
  • Buy Cheapest strongest pain medications Now Online Medical Shop. Cheap Online Pharmacy.
  • Buy Cheapest appetite suppressant medication Online Best Online. No Prescription Needed.
  • Buy Cheap phentermine for less Now Guaranteed Shipping. Online Medical Shop.
  • Buy Cheapest cost of prescription for chlamydia Now Best Online. Order Cheap Meds Without Rx.
  • Buy Cheapest xanax dosage Online Best Drugstore. Free Viagra Pills!
  • Buy Cheapest ultram withdrawl Now Best Internet. No Prescription Needed.
  • Buy Cheapest canadian prescription medications Online Best Prices. Discount Pharmacy Online.
  • Buy Cheapest very cheap tramadol Online Discount Online Pharmacy. Best Internet.
  • Buy Cheapest xanax pregnancy Online Guaranteed Shipping. Free Viagra Pills!
  • Buy Cheap do diet pills work Online Top Online Pharmacy. Best Drugstore.
  • Buy Cheapest long term use of ambien Online Online Prices For long term use of ambien! Low Prices.
  • Buy Cheap zithromax 500 mg Online Cheap Prescription Drugs. Best Internet.
  • Buy Cheapest list of vitamin supplements Online Drugs, Health And Beauty. Best Prices.
  • Buy Cheapest atorvastatin Now Best Online. Discount Pharmacy Online.
  • Buy Cheap viagra cheapest online sellers Now Top Online Pharmacy. Drugs, Health And Beauty.
  • Buy Cheap where to buy levitra Now Buy Medications Online. Cheap Online Pharmacy.
  • Buy Cheap pfizer viagra dosage 100 mg Online Guaranteed Shipping. Pharmacy Store.
  • Buy Cheapest diazepam anxiety Now 24/Online Pharmacy. WorldWide Shipping.
  • Buy Cheap viagra testosterone Online Low Prices. Top Online Pharmacy Supplier.
  • Buy Cheap ambien canadian pharmacy Now Pharmacy Store. Discount Pharmacy Online.
  • Buy codeine pills Without Prescription Doctor. Internet Prices For codeine pills!
  • Buy Cheapest canadian pharmacy meds Online Guaranteed Shipping. Best Prices.
  • Buy Cheapest most effective prescription sleep aids Online Cheap Online Pharmacy. Best Drugstore.
  • Buy Cheap reliable online pharmacies Online Drugs, Health And Beauty. Best Online.
  • Buy Cheap alprazolam generic for xanax Online Online Medical Shop. Pharmacy Store.
  • Buy Cheapest cost of chlamydia medication Online Best Prices. No Prescription Needed.
  • Buy Cheap pmdd medicine Online Pharmacy Store. No Prescription Needed.
  • Buy Cheap diet pill phentermine Now Special Prices For diet pill phentermine! Best Prices.
  • Buy Cheap valtrex cheap Now Online Prices For valtrex cheap! Top Online Pharmacy.
  • Buy alprazolam pills Online Without Prescription. Best Prices. Best Online.
  • Buy Cheap safe generic cialis Now Best Prices. Order Cheap Meds Without Rx.
  • Buy Cheap buspirone hcl Now Cheap Prescription Drugs. Top Online Pharmacy.
  • Buy Cheap stress valium Now Best Internet. Pharmacy At The Best Price!
  • Buy Cheap phentermine 37.5 diet pills Now Pharmacy At The Best Price! Best Internet.
  • Buy Cheapest cialis soft tab description Now Cheap Pharmacy Online. WorldWide Shipping.
  • Buy Cheapest order pain medicine online Now Internet Prices For order pain medicine online! Pharmacy Store.
  • Buy Cheap buy propecia where Online No Prescription Needed. Best Prices.
  • Buy Cheap best levitra price Now Online Medical Shop. Free Viagra Pills!
  • Buy Cheap viagra from uk Online Best Prices. Cheap Prescription Drugs.
  • Buy Cheap valium 5mg Now Best Internet. Top Online Pharmacy Supplier.
  • Buy Cheap buy online zoloft Now Buy Medications Online. Top Online Pharmacy.
  • Buy Cheapest natural appetite suppressants Now Top Online Pharmacy. WorldWide Shipping.
  • Buy Cheap narcotic pain pills without a prescription Online Online Medical Shop. Guaranteed Shipping.
  • weight loss herbs Online Without Prescription Low Prices. WorldWide Shipping.
  • Buy Cheap weight loss remedies Now Guaranteed Shipping. Discount Online Pharmacy.
  • Buy viagra dosing Online Without Prescription. Best Prices. Best Online.
  • Buy Cheap fat burning diet Now Pharmacy Store. Order Cheap Meds Without Rx.
  • Buy Cheap ambien side effect Online Cheap Online Pharmacy. Pharmacy Store.
  • Buy Cheap tramadol dosage Online Special Prices For tramadol dosage! Best Online.
  • Buy Cheap medical weight loss Online Online Medical Shop. Top Online Pharmacy.
  • Buy Cheap order viagra jelly Now Best Online. The Largest Internet Pharmacy.
  • Buy Cheapest free trial diet pills Now Cheap Pharmacy Online. Guaranteed Shipping.
  • Buy Cheapest online pet pharmacy Online Best Drugstore. Cheap Pharmacy Online.
  • top 10 diet pills Online Without Prescription Free Viagra Pills! Best Online.
  • Buy Cheapest azithromycin bronchitis Online Best Internet. Discount Online Pharmacy.
  • Buy Cheap drugs for schizophrenia Now 24/Online Pharmacy. WorldWide Shipping.
  • Buy Cheap buy pheromone to attract woman Online Best Prices. No Prescription Needed.
  • Buy Cheap viagra substites Now Pharmacy Store. Order Cheap Meds Without Rx.
  • Buy Cheap proscar 5 mg Now Pharmacy Store. Top Online Pharmacy Supplier.
  • Buy Cheapest cheap lexapro Now Top Online Pharmacy. Cheap Pharmacy Online.
  • buy valium cheap Online Without Prescription Free Viagra Pills! Low Prices.
  • Buy Cheap top 10 diet pills Online Best Online. Pharmacy At The Best Price!
  • Buy Cheapest how fast does valium work Now Best Internet. Special Prices For how fast does valium work!
  • Buy Cheapest on line cialis Now Top Online Pharmacy Supplier. Best Online.
  • Buying Cheap zyban how to use. Mexican Pharmacy, Good Prices. Best Drugstore.
  • Buy Cheap purpose of xanax Now Best Online. All Medications Are Certificated!
  • Buy Cheapest bayer levitra professional pro Online Best Drugstore. Free Viagra Pills!
  • Buy Cheap klonopin and pregnancy Now Best Drugstore. Discount Online Pharmacy.
  • Buy Cheap cheap drugs Online Best Online. Internet Prices For cheap drugs!
  • Buy Cheapest geodon and codeine Online Online Medical Shop. WorldWide Shipping.
  • Buy Cheapest discount erectile dysfunction medicatin Online WorldWide Shipping. Best Drugstore.
  • Buy Cheap us based viagra Online 100% Satisfaction Guaranteed. Best Prices.
  • Buy prescription drugs generic medicines brand product Online Without Prescription. Pharmacy Store. Low Prices.
  • Buy Cheap trazodone sleep aid Online Pharmacy Store. Guaranteed Shipping.
  • Buy Cheapest tramadol doses Online 24/Online Pharmacy. Best Internet.
  • Buy Cheapest clomid take Now Top Online Pharmacy. Free Viagra Pills!
  • Buy Cheapest herbal based diet products Now Best Online. Special Prices For herbal based diet products!