jun 13

No se si alguna vez os ha pasado que para limpiar vuestro simulador (iPhone Simulator) en lugar de borrar aplicación por aplicación, hicisteis un reset y después os encontrasteis conque desaparecieron todas las fotos XD, que esperabais ;) .

Bien, pues tanto si hicisteis un reset intencionadamente, sin querer, o para limpiar toda los datos y apps innecesarios que se acumulan al hacer pruebas y más pruebas aquí van un par de trucos para añadir nuevas fotos:

Fotos que tenemos en archivos:

Para añadir fotos que ya tenemos en alguna otra carpeta solo teneis que copiarlas en la siguiente ruta.

~/Users/<usuario>/Library/Application Support/iPhone Simulator/3.1.3/Media/DCIM/100APPLE

Donde <usuario> es vuestro nombre de usuario, si no y quizá tengáis que cambiar también la versión del SDK por la que estéis usando.

Nota: He visto varias rutas diferentes, que empiezan diractamente por ~/Library/Application Support/iPhone Simulator/…, la idea es que tenéis que estar dentro de la carpeta del iPhone Simulator, y añadir las fotos en Media/DCIM/100APPLE, si esta última carpeta no esta crearla.

Variante: También podéis abrir Safari dentro del simulador y arrastrar el archivo a la pagina web de éste, luego haced click y no solteis el botón hasta que os aparezca la opción de salvar la imagen. Se os añade a la librería de fotos.

Fotos desde internet:

En caso de que queráis añadir nuevas fotos desde internet, por ejemplo desde google images, solo tenéis que hacer como antes (en la variante) y pulsar sobre la imagen, aguantando el botón hasta que os deje guardarla.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
Tagged with:
jun 09

Como todos sabréis las aplicaciones iPhone viven en su propia parcela y tiene un acceso muy restringido al resto del sistema.

Aún y así Apple nos ofrece un mecanismo para comunicarnos con otros programas. Al decir comunicar, quiero decir que podemos lanzar otras aplicaciones y opcionalmente pasarles parámetros (si lo soportan).

Para conseguirlo se usan URLs especiales. Cada aplicación puede definir su propia URL para que otros le puedan llamar.

Por ejemplo para abrir la aplicación SMS desde nuestro código escribiríamos el siguiente código:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:1111111"]];

Como vemos, estamos llamado al método openURL del objeto UIApplication pasándole una URL.
Y la URL en si indica primero el protocolo (sms) y luego como parámetro un número de teléfono.
Al ejecutar esta línea de código se cerrará nuestra app y se abrirá el SMS y con el campo número automáticamente rellanado con el número que le hemos pasado como parámetro (en este caso 1111111).

Los principales programas de iPhone (mail, sms, youtube, maps, itunes) soportan estos URLs. Pueden consultar el formato de los URLs de todas las apps en este link.

Y no sólo las apps oficial de Apple soportan URLs sino nosotros también podemos crear URLs especiales para nuestras apps pero eso lo explciaremos en otro artículo.

En está wiki podéis encontrar una lista bastante grande de aplicaciones (tanto los de Apple como de terceros) que soportan URLs y podréis ver como usarlos.

VN:F [1.9.8_1114]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
Tagged with:
jun 09

Hoy venimos con otro artículo donde explicaremos la manera más simple de envíar emails desde nuestras aplicaciones.

A partir de la versión 3.0 del iPhone OS Apple introdujo un nuevo framework llamado MessageUI para permitir a los desarrolladores envíar emails desde sus aplicaciones de forma fácil y cómoda.

¿Cómo usarlo?

Antes que nada tenemos que incluir el MessageUI framework ya que no viene por defecto.

Una vez incluida el framework, en los ficheros donde vayamos a usar la funcionalidad de email tenemos que incluir las interfaces del framework con:

#import <MessageUI/MessageUI.h>

MessageUI framework nos ofrece una clase llamada MFMailComposeViewController que nos ofrece toda la funcionalidad de email de forma fácil y incluye la interfaz de usuario para edición de emails.

Aquí tenemos un ejemplo de uso (suponemos que estamos en un view controller):

//Creamos el controller encargado de los mails
MFMailComposeViewController *m = [[MFMailComposeViewController alloc] init];
//Asignamos los destinos a los que envíar el email
[m setToRecipients:[NSArray arrayWithObject:@"info@intelligentconta.com"]];
m.mailComposeDelegate = self;
//Mostramos la vista de edición de email
[self presentModalViewController:m animated:YES];
[m release];

En el código de arriba una de las partes a detectar es la asignación del delegado y es que en nuestro código donde vayamos a usar el MFMailComposeViewController tenemos que implementar el delegado MFMailComposeViewControllerDelegate para saber si el usuario ha enviado el email, si lo ha cancelado, si ha habido algun error, etc.
El delegado sólo contiene un método:
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
El parámetro MFMailComposeResult nos indicará el resultado con el que ha terminado la composición del email. Se suele usar este método para dependiendo del resultado esconder la vista de edición de email o mostrar un mensaje de error al usuario.

MFMailComposeViewController tiene otras propiedades y métodos para asignar ficheros adjuntos, destinatarios ocultos, etc. Puede consultar la documentación completa aquí.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
Tagged with:
jun 09

En este artículo vamos a ver la forma más simple de reproducir vídeo en nuestras aplicaciones desde el código objecitve-c.

Para eso vamos a usar el MediaPlayer framework del iPhone. Al final del artículo podéis encontrar el link de descarga del poryecto de ejemplo.

Antes de empezar con la programación tenemos que añadir el framework MediaPlayer al nuestro proyecto ya que no viene por defecto. Como siempre, hacemos click derecho en el grupo Frameworks del proyecto y elegimos: Add > Exisiting Frameworks…

Esto nos abré la siguiente ventana donde tenemos que elegir el MediaPlayer y hacer click en Add:

Supongamos que tenemos un view controller que contiene un botón normal y queremos reproducir un vídeo al puslar en ese botón. También vamos a suponer que ya ha añadido ese botón en el Interface Bulider y lo ha enlazado con el método -(IBAction)playVideo:(id)sender de su view controller.

Vamos a ver el código a usar para crear el reproductor de vídeo que reproducirá un ficher de video determinado.

Antes que nada vamos a ver cómo sería la declaración de nuestra clase (el .h del view controller). Fíjense que hacemos #import <MediaPlayer/MediaPlayer.h> para poder acceder a las interfaces del MediaPlayer framework y declaramos una variable de tipo MPMoviePlayerController que se encargará de mostrar el vídeo.

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
 
@interface EjemploVideoViewController : UIViewController {
	MPMoviePlayerController *player;
}
 
-(IBAction)playVideo:(id)sender;
 
@end

Ahora en el método – (void)viewDidLoad de nuestro view controller (en el .m) ponemos el siguiente código:

NSURL *movieFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"video" ofType:@"mp4"]];
player = [[MPMoviePlayerController alloc] initWithContentURL:movieFile];

En la primera línea obtenemos el path de nuestro fichero de vídeo (en este caso tenemos el vídeo entre nuestros ficheros de recursos como video.mp4) y con ese path creamos el reproductor del vídeo.

Finalmente al pulsar el botón que habíamos creado en el Interface Builder ejecutaremos el siguiente código:

[player play]

Y ya está, con esto conseguiremos reproducir un vídeo en nuestro programa.

Se puede usar el MPMoviePlayerController también para reproducir videos en streaming.
Los vídeos suelen ser ficheros grandes cuya carga puede llevar un tiempo determinado. Para el constructor de MPMoviePlayerController carga el vídeo en un thread diferente para no bloquear la ejecución del programa.
Si queremos saber cuando ha terminado la carga del vídeo podemos suscribirnos a la notificación llamada MPMoviePlayerContentPreloadDidFinishNotification de la siguiente manera:

[[NSNotificationCenter defaultCenter]
     addObserver:self
            selector:@selector(miMetodo:)
                name:MPMoviePlayerContentPreloadDidFinishNotification
               object:nil];

Descargar proyecto de ejemplo.

VN:F [1.9.8_1114]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.8_1114]
Rating: +1 (from 3 votes)
Tagged with:
jun 07

Hace unos semanas en ZenBrains hemos organizado dos sorteos para ganar tarjetas de reaglo iTunes de 15€ patrocinados por dos de los nuestros programas: ZenTap Pro y  Letris.

Desde hace más de una semana tenemos los nombres de los ganadores que han recibido sus premios y la lista de todos los participantes que podéis ver a continuación.

El ganador del sorteo de Letris es (nick en twitter): @GoriPhone

Lista de participantes del sorteo de Letris: 

alexito4
alexelgt
cicirtap
pablogargar
jceballosd
vanemt
GoriPhone
pvieito
Diegoball
Otein
iDapp30
altoselfos
souto
alienboyxp
Gutiserra
iTuneswitter
santifer
sergicuadrado
Soul_Dew
quiquesanz
cstockmans
cascaman
josejq
gzalomoscoso
magd80
guayos
damolro
Ragnono
leowys
Antoniogra7
DanielMoralesA
rubreakdown
QuirogaXD
Shorty_A

El ganador del sorteo de ZenTap Pro es (nick en twitter): @kevinroscu

Lista de participantes del sorteo de ZenTap Pro: 

iDraze
nil_caste
kevinroscu
danimarbella
agu69
albertfrutos
rudyhervas
Arthurbetiko
TxeMac
D0natell00
purri81
rodry092
javielos
jimslope
edipotrebol
SmartOrc
DjJaB3
YoYeMac
dvalientes
pmarchas
jos2karr
luman
ardon
matthewlvj

Enhorabuena a los ganadores y gracias a todos por participar.

Si queréis estar al tanto de los futuros sorteos síguenos en el twitter.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
Tagged with:
jun 07

En muchísimas ocasiones en nuestros proyectos necesitamos cambiar el tamaño de las imágenes con las que trabajamos.

Hoy vamos a ver un segmento de código que podemos usar para no sólo cambiar el tamaño de nuestras imágenes sino también recortarlos.

En la app de Photos de iPhone en la vista donde se ve el mosáico de nuestros fotos podemos ver que las imágenes están escaladas para que quepan en un cuadradito y todos tengan el mismo tamaño. Para eso lo que hacen es escalar los imágenes y recortarlos.

A continuación vamos a ver un método que nos permite hacer lo de arriba citado.

El método recibe un UIImage y el tamaño final que queremos que tenga y devuelve un UIImage nuevo con el tamaño especificado:

- (UIImage*)imageWithImage:(UIImage*)image
			  scaledToSize:(CGSize)targetSize;
 
{
	UIImage *sourceImage = image;
	UIImage *newImage = nil;
	CGSize imageSize = sourceImage.size;
	CGFloat width = imageSize.width;
	CGFloat height = imageSize.height;
	CGFloat targetWidth = targetSize.width;
	CGFloat targetHeight = targetSize.height;
	CGFloat scaleFactor = 0.0;
	CGFloat scaledWidth = targetWidth;
	CGFloat scaledHeight = targetHeight;
	CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
 
	if (CGSizeEqualToSize(imageSize, targetSize) == NO)
	{
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;
 
        if (widthFactor &gt; heightFactor)
			scaleFactor = widthFactor; // scale to fit height
        else
			scaleFactor = heightFactor; // scale to fit width
        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;
 
        // center the image
        if (widthFactor &gt; heightFactor)
		{
			thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
		}
        else
			if (widthFactor &lt; heightFactor)
			{
				thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
			}
	}       
 
	UIGraphicsBeginImageContext(targetSize); // this will crop
 
	CGRect thumbnailRect = CGRectZero;
	thumbnailRect.origin = thumbnailPoint;
	thumbnailRect.size.width  = scaledWidth;
	thumbnailRect.size.height = scaledHeight;
 
	[sourceImage drawInRect:thumbnailRect];
 
	newImage = UIGraphicsGetImageFromCurrentImageContext();
	if(newImage == nil)
        NSLog(@"could not scale image");
 
	//pop the context to get back to the default
	UIGraphicsEndImageContext();
	return newImage;
}

Otra posibilidad tal vez más universal para recortar y cambiar el tamaño de los UIImages es hacer que los UIImage mismos lo soporten.
Eso se consigue implementando “Categories” para la clase UIImage.
En esta entrada(inglés) tenéis una buena implementación que dota de soporte a cambio de tamaño y recortado a los UIImages.

Código obtenido vía una entrada en StackOverflow

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
Tagged with:
jun 06

Mañana a las 19:00, hora Española, empieza la Worldwide Developer Conference de Apple, en el Moscone West en San Francisco, California y que durará hasta el día 11. Se esperan con impaciencia varias novedades entre ellas el lanzamiento oficial del iPhone 4.0, que aunque fue presentado antes de tiempo por Gizmodo, pagarón 5.000$ por un supuesto iPhone 4.0 encontrado en un bar y que finalmente Apple reclamo como suyo, no deja de generar rumores. Habrá modificaciones sobre el modelo desvelado? o será efectivamente el definitivo iPhone 4.0?

A parte del teléfono también se esperan otras novedades:

  • iPhone OS 4.0.
  • Apple TV.
  • Mac OS X 10.6.4.
  • Safari 5
  • Versión gratis del MobileMe

El evento se podrá seguir en varios blogs y se espera que también esten disponibles live streams. A continuación tenéis una lista de los posibles blog y streams que seguramente cubran el encuentro.

Blogs

GDGT Live
Gizmodo
MacRumors Live
The Apple Blog
CNET Live

Streams
Watch Apple WWDC 2010 event live online on CrunchGear
Watch WWDC 2010 live streaming on Twit Live TV
Watch 2010 WWDC iPhone HD event on LiveTechEvents

Información recopilada de varios sitios de internet.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
Tagged with:
jun 05

Hoy vamos a ver como se pueden crear vistas (UIViews) personalizados.
En muchas ocasiones no tenemos suficiente con los controles que vienen con el UIKit y entonces tenemos que crear nuestros propios controles.
En este artículo vamos a ver un ejemplo muy simple de creación de vistas propias.
Al final del artículo podréis descargar el proyecto de ejemplo donde implementamos nuestra vista personalizada y hacemos uso de ella.
En el ejemplo vamos a intentar crear una barra de progreso simple.
Entonces, vamos a crear una nueva clase que heredará de UIView, la llamaremos “VistaPorcentaje”. Nuestra VistaPorcentaje tendrá dos propiedades: el porcentaje y el color de la barra.
Así queda la declaración de la clase:

#import 
 
@interface VistaPorcentaje : UIView {
	UIColor *barColor;
	CGFloat porcentaje;
}
 
@property (nonatomic, retain)UIColor *barColor;
@property (nonatomic, setter=setPorcentaje)CGFloat porcentaje;
 
-(void)setPorcentaje:(CGFloat)p;
 
@end

Ahora que ya tenemos definida nuestra clase vamos a ver su implementación:

#import "VistaPorcentaje.h"
 
@implementation VistaPorcentaje
@synthesize barColor, porcentaje;
 
- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
		self.barColor = [UIColor greenColor];
		self.porcentaje = 0.0;
 
    }
    return self;
}
 
- (void)drawRect:(CGRect)rect {
   CGContextRef context = UIGraphicsGetCurrentContext();
    context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, self.barColor.CGColor);
 
	//Calculamos el ancho de la barra dependiendo del porcentaje
	CGFloat ancho = self.frame.size.width * porcentaje/100.0;
 
	//Dibujamos la barra del porcentaje
	CGRect r = CGRectMake(0, 0, ancho, self.frame.size.height);
	CGContextAddRect(context, r);
    CGContextFillRect(context, r);
 
}
 
-(void)setPorcentaje:(CGFloat)p{
	porcentaje = p;
	if (porcentaje &gt; 100.0)
		porcentaje = 100.0;
 
	if (porcentaje &lt; 0.0)
		porcentaje = 0.0;
 
	[self setNeedsDisplay];
}
 
- (void)dealloc {
	[barColor release];
	[super dealloc];
}
@end

Aquí los métodos claves son el drawRect y setPorcentaje. Dentro de drawRect implementamos toda la funcionalidad de pintura de nuestra vista. Básciamente en nuestro caso sólo pintamos un rectangulo de un tamaño equivalente al porcentaje respecto al ancho total de la vista.
Y el otro método, setPorcentaje, se llama cada vez que el usuario cambia la propiedad porcentaje. Fijaros que en este método tenemos una llamada [self setNeedsDisplay]. Con esa llamada decismos que se repinte (nunca llamamos directamente a drawRect) ya que se ha cambiado el porcentaje.

A continuación podemos ver un ejemplo de nuestro control (estamos en un view controller):

- (void)viewDidLoad {
    [super viewDidLoad];
 
	VistaPorcentaje *v = [[VistaPorcentaje alloc] initWithFrame:CGRectMake(10, 10, 200, 50)];
	v.backgroundColor = [UIColor whiteColor];
	v.barColor = [UIColor greenColor];
	v.porcentaje = 67.0;
	[self.view addSubview:v];
	[v release];
 
}

A base de este simple ejemplo se puede construir controles propios para mostrar histogramas, crear controles propios que respondan a las acciones de usuario y miles de cosas más.

EjemploVistaPersonalizada

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
Tagged with:
jun 05

Cuando queremos crear una aplicación que contenga diferentes funcionalidades relacionadas con el uso de la aplicación, pero independientes entre si, como mostrar los datos de diferente manera o diferentes tareas, querremos usar una Tab Bar en nuestra aplicación.

La Tab Bar nos dará acceso a esas diferentes tareas o vistas, separándolas dentro de nuestra aplicación como módulos independientes, además, sitúa al usuario dentro de la aplicación indicándole lo que esta viendo en ese momento.

Hoy daremos las indicaciones básicas para crear y configurar una Tab Bar para nuestra aplicación. Dentro de Xcode tenemos una plantilla que nos crea una aplicación con un Tab Bar y dos vistas diferentes, aunque es un buen punto de partida, cuando miramos el código a penas vemos que es lo que realmente se esta haciendo ya que toda la configuración la hacen desde Interface Builder. Nosotros mostraremos algo más de código.

Estructura

Tenemos nuestra aplicación, dentro de ésta estará nuestra Tab Bar, a la que le indicaremos que vistas (UIViewController) ha de mostrar, cada vista se ocupará de su funcionalidad, pero tenemos que configurar la propiedad tabBarItem (UITabBarItem), de cada una de las vistas para que la Tab Bar nos pueda mostrar el icono y titulo de esa pestaña.

Datos

Para configurar la Tab Bar lo único que necesitamos es un icono para cada pestaña, y un título. Podemos usar ambos a la vez o cada uno por separado, obviamente una Tab Bar sin iconos pierde mucho, por lo que recomiendo que al menos se use un icono para representar lo que la pestaña hace, el título siempre va bien por si el icono no deja del todo claro.

El titulo no es más que una cadena que indicaremos dentro del código, pero el icono es algo más especial y aunque Apple nos suministra algunos iconos típicos del sistema, para usarlos echar un vistazo a  UITabBarSystemItem, también nos indica como tenemos que crear nuestros propios iconos:

▪ Usar formato PNG.
▪ El único color a de ser blanco puro con transparencia apropiada.
▪ No añadir sombras.
▪ Usar anti-aliasing.
▪ Tamaño de 30 x 30 pixeles.

Código

Para crear la Tab Bar y añadirla a nuestra aplicación simplemente usar lo siguiente:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
 
tabBarController = [[UITabBarController alloc] init];
 
MyViewController* vc1 = [[MyViewController alloc] init];
 
MyOtherViewController* vc2 = [[MyOtherViewController alloc] init];
 
NSArray* controllers = [NSArray arrayWithObjects:vc1, vc2, nil];
 
tabBarController.viewControllers = controllers;
 
[window addSubview:tabBarController.view];
 
}

En el applicationDidFinishLaunching creamos el TabBarController, los UIViewController para cada una de nuestras pestañas, metemos estos últimos en un vector y le indicamos al controlador de la Tab Bar que serán esos los que ha de mostrar. Finalmente añadimos la vista de la Tab Bar a nuestra ventana y listos.

Para configurar cada uno de los UITabBarItem de cada una de las vistas podemos usar las siguientes líneas:

UIImage* anImage = [UIImage imageNamed:@"MyTabBarIcon.png"];
 
UITabBarItem* theItem = [[UITabBarItem alloc] initWithTitle:@"TabBarItemTitle" 
                                                     image:anImage tag:0];
 
[myViewController setTabBarItem:theItem];

Normalmente se usarán dentro del mismo controlador, al inicializarlo, pero puede ser necesario hacerlo desde otro lugar cuando no estamos creando nuestra propia clase, por ejemplo si una de las vistas usa un UINavigationBar, en ese caso se puede usar el código anterior justo cuando creamos el controlador para la barra de navegación.

VN:F [1.9.8_1114]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.8_1114]
Rating: -1 (from 1 vote)
Tagged with:
may 29

Esta misma semana, en un post anterior, se enseñaba como usar la típica animación para mostrar una vista con los créditos del programa usando animaciones. Hoy vamos a hacer lo mismo pero usando la presentación de vistas modales que ya viene implementada en la clase UIViewController.

Lo que se mostró en el post anterior nos va bien cuando queremos controlar completamente la animación, pero esta otra forma nos ahorra mucho código y si no queremos hacer nada especial, durante la animación, es suficiente.

Empezamos de igual forma, tenemos una vista de tabla dentro de una barra de navegación, añadimos el boton de información en nuestro controlador de la vista principal.

- (void)viewDidLoad {
    [super viewDidLoad];
 
    self.title = @"Menu inicial";
 
    UIButton* infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
    [infoButton addTarget:self action:@selector(showAbout:) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:infoButton];
}

Pero en este caso nuestro showAbout será más sencillo

-(void)showAbout:(id)sender{
	AboutController *a = [[AboutController alloc] init];
	UINavigationController *n = [[UINavigationController alloc] initWithRootViewController:a] ;
	[a release];
 
	[a setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
	[self presentModalViewController:n animated:YES];
}

Seguimos creando una barra de navegación y nuestra vista de creditos, pero esta vez le indicamos a nuestra vista de creditos como queremos que sea la animación al presentarla, en modo modal, mediante [a setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; y finalmente le indicamos al controlador de la vista en la que estamos, que nos presente la vista de la nueva barra de navegación.

Aquí hay un punto un poco confuso, le estamos indicando a un controlador como ha de ser la animación, pero presentando otro controlador diferente, de echo, si en lugar de [a setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; usamos [n setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; con el controlador de la barra de navegación, obtenemos el mismo resultado, ya que la vista de creditos es el rootViewController de ésta. Pero no podemos hacer lo mismo con la última instrucción, porque entonces no se mostraría la barra de navegación que nos permite cerrar la vista de créditos.

Ahora en el .m de About controller dejamos el viewDidLoad intacto, añadimos el botón “Ok” y hacemos que al pulsarlo se vuelva a nuestro controller principal.

- (void)viewDidLoad {
    [super viewDidLoad];
    UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone target:self action:@selector(close:)];
    self.navigationItem.rightBarButtonItem = btn;
    [btn release];
}
 
pero nuestro close se reduce a una única llamada que hace la animación contraria y nos devuelve a la vista principal
 
-(void)close:(id)sender{
       [self dismissModalViewControllerAnimated:YES];
}

Fijaros también que, de esta manera, no nos hace falta guardar el controlador principal en una variable para volver a él, ya que de esta forma lo seguimos teniendo en la jerarquia de vistas.

VN:F [1.9.8_1114]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.8_1114]
Rating: +1 (from 1 vote)
Tagged with:
preload preload preload