Gestione rotazione dei device iOS

Ultimamente mi sono dovuto scontrare, per l’ennesima volta, nel delirio del cambio di orientamento dei device iOS. Per quanto in Apple si siano dati da fare per semplificare la vita agli sviluppatori, questo tema è ancora un buco nero. Ci sono diversi sistemi per gestire il cambio di orientamento, di cui uno
Chiaramente, il mio obiettivo è di scrivere meno codice possibile, utilizzare Interface Builder per permettere ai designer di modificare la geometria delle interfacce senza dover intervenire sul codice, ridurre al minimo i calcoli delle posizioni degli elementi all’interno dei controller.ufficiale e presentato da Apple come esempio sul sito developer. Il problema è che, per quanto sia ufficiale, non soddisfa le mie esigenze. Oltre alla rotazione, ho anche il problema di dover presentare interfacce diverse a seconda dell’orientamento e del device (iPhone o iPad).

Alla fine ho optato per un sistema con un UIViewController di base da cui derivano i vari controller portrait e landscape. I controller sono tutti agganciati ad un UINavigationController che si prende cura di mandare i messaggi di willRotate e didRotate ai vari controller collegati senza che dobbiamo gestirceli noi a mano.

Il controller di base contiene anche tutti gli outlet che vengono collegati in IB agli oggetti disegnati nell’interfaccia, così possiamo tenere il codice di gestione di azioni e interazione con gli oggetti al minimo.
Per chi volesse vedere come funziona questo sistema, ho aperto un repository su GitHub chiamato RotationExample

 

 

 

 

 

Novità su iTablo

E’ da un po’ che volevo scrivere un paio di righe riguardo iTablo, la soluzione che abbiamo sviluppato per la pubblicazione di riviste e cataloghi su iPad. Qualcuno, probabilmente, avrà già letto qualcosa nei miei post di qualche mese fa. Per chi non sapesse di cosa sto parlando, iTablo è il nome che abbiamo dato a questa soluzione che è composta da un lettore (una app per iPad), un designer (un’applicazione desktop per OS X e Windows) ed una serie di servizi accessori per l’hosting dei contenuti. A che serve? A pubblicare dei PDF arricchiti da elementi multimediali fondamentalmente.

Rispetto agli esordi di un anno fa, il prodotto si è decisamente evoluto. Non sto qui a snocciolare i dettagli.. per quelli c’è il sito (per ora in lingua d’Albione, ma da metà settembre sarà anche in Italiano): http://www.itablo.com/

Magari in un prossimo post parlerò un po’ della tecnologia che sta dietro ad iTablo. Per ora mi limito a dire che sono parecchio orgoglioso del lavoro svolto dal team che lo ha concepito e portato avanti. E sono contento di poter dire di aver trovato un ottimo partner per la commercializzazione di iTablo. Infatti, fin da ora è possibile acquistare iTablo tramite Graphiland, azienda leader nella distribuzione di prodotti per l’editoria. La scheda del prodotto ed il listino sono reperibili qui: scheda di iTablo

Per chi, invece, volesse saperne di più, i signori di Graphiland hanno organizzato una serie di seminari per il mese di Settembre in cui il qui presente mostrerà come trasformare le proprie pubblicazioni cartacee in contenuti multimediali interattivi consultabili su iPad. Qui potete vedere il calendario. Iscrivetevi e non ve ne pentirete! Mi raccomando, nel caso fatemi sapere chi siete e che arrivate da qui! 🙂

ZipArchive + iOS = non come libreria non statica

Come sempre sono incappato in un problema di quelli che saltano fuori casualmente durante lo sviluppo. Sono mesi che utilizzo una mia libreria che, a sua volta, utilizza la ZipArchive. Di punto in bianco ha cominciato ad apparire questo errore:

___gxx_personality_v0$non_lazy_ptr in xxxxxLibrary (ZipArchive.o)

Dopo un pò di ricerche scopro che XCode per qualche motivo non utilizza g++ ma gcc per compilare le librerie. Il trucco sta nel rinominare ZipArchive.mm in ZipArchive.m .. perchè per qualche motivo così cambia il compilatore che utilizza.. mah.. XCode non smette mai di stupirmi.

Per maggiori info: http://code.google.com/p/ziparchive/issues/detail?id=4

Come caricare una texture via URL con Cocos2D

Tanto per cambiare sono inciampato in un problema durante lo sviluppo di un gioco su iPhone. In pratica ho la necessità di caricare un’immagine da utilizzare come texture da un sito web e non dal bundle dell’applicazione.

Cocos2d non mette a disposizione dei metodi per caricare direttamente l’immagine come e fosse una texture qualsiasi. Ma c’è un modo per circumnavigare il problema:

NSString *url = [NSString stringWithString:@"http://www.blabla.com/myimage.png"];
Texture2D *tex;
UIImage * img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url]]];
if (img) {
		tex = [[Texture2D alloc] initWithImage:img];
}

A questo punto possiamo passare la texture in pasto allo sprite o a qualsiasi altro oggetto necessiti l’immagine che abbiamo appena caricato. Facile ed indolore.