Articoli con Tag ‘Undolibrary’


iPhone SecondApp: indovina il numero – parte 2

Come anticipato in iPhone FirstApp: indovina il numero – parte 1 vediamo come realizzare un’applicazione per Apple iPhone senza usare Interface Builder! Anzi, elimineremo fisicamente i file di Interface Builder creati dal wizard di Xcode. Alla fine di questo post, quindi, avremo un’applicazione identica, in tutto e per tutto, a quella realizzata nella parte prima, con la differenza che realizzeremo tutti i nostri componenti visivi, compresa la Window principale, completamente da codice.

L’applicazione già fatta, se volete solo scaricarla, è disponibile sul mio Google Code repository:

Vorrei far notare da subito come lo ZIP di questo esempio pesi meno di quello della scorsa volta! :)

Creiamo il progetto

Iniziamo creando il nostro progetto SecondApp (per distinguerlo da FirstApp), anche se questa volta sceglieremo Window-based Application:

newproject

Adesso andiamo ad eliminare tutto ciò che riguarda Interface Builder. Eliminiamo il file MainWindow.xib, situato nella cartella Resources: eliminatelo anche dal file system, quindi selezionate Also Move to Trash. Selezionate, poi, il file SecondoApp-info.plist ed eliminate il riferimento alla MainWindow nella casella Main nib file base name:

deleteib

A questo punto non abbiamo più nessuna Window, almeno tramite Interface Builder. Quindi apriamo il file main.m, situato in Other Sources, e modifichiamo la funzione main() in questo modo:

1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char *argv[]) {
   
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
    // avendo eliminato il file .xib abbiamo perso il puntamento
    // all'app delegate, quindi lo passiamo a "mano"
    int retVal = UIApplicationMain(argc, argv, nil, @"SecondAppAppDelegate");

    [pool release];
    return retVal;
}

Apriamo quindi SecondAppAppDelegate.m e creiamo la Window principale via codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // ottiene le dimensioni delle schermo (320, 480)
    CGRect windowRect = [[UIScreen mainScreen] applicationFrame];
    // creiamo una finestra - visto che abbiamo fatto bye bye a Interface Builder
    UIWindow *mainWindow = [[UIWindow alloc] initWithFrame:windowRect];
    // impostiamo il background della Window a giallo, per differenziarlo
    // dalla precedente applicazione FirstApp
    [mainWindow setBackgroundColor:[UIColor yellowColor]];
 
    [self setWindow:mainWindow];
    [window makeKeyAndVisible];
 
    [mainWindow release];
}

Potete già provare l’applicazione; se appare una window gialla avete fatto tutto bene!

Nel file SecondAppAppDelegate.h possiamo eliminare IBOutlet, necessario solo se si usa Interface Builder. Inoltre aggiungiamo qui le nostre variabili globali che, nella scorsa volta, avevamo inserito nel Controller. Modifichiamo quindi il file SecondAppAppDelegate.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import <UIKit/UIKit.h>

@interface SecondAppAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
 
    UITextField *numero;
    UIButton *bottone;
    int numeroACaso;
}

@property (nonatomic, retain) UIWindow *window;

- (void)controllaNumero;

@end

Anche in questo caso abbiamo preparato la definizione del metodo controllaNumero, come la scorsa volta, ma abbiamo eliminato l’indicazione IBAction, in quanto non stiamo usando Interface Builder.

Costruiamo l’interfaccia da codice

E’ giunto il momento di creare tramite codice tutti i componenti della nostra interfaccia. Torniamo nel file SecondAppAppDelegate.m, posizioniamoci prima del [mainWindow release] ed inseriamo il seguente codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// crea la barra del titolo
UINavigationBar *myNavigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)];
myNavigationBar.barStyle = UIBarStyleDefault;
UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@"Indovina un numero"];
[myNavigationBar pushNavigationItem:navigationItem animated:NO];
[window addSubview:myNavigationBar];
 
// crea la label
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 300, 80)];
myLabel.backgroundColor = [UIColor clearColor];
myLabel.numberOfLines = 2;
myLabel.text = @"iPhone ha pensato un numero da 1 a 10, prova ad indovinarlo?";
[window addSubview:myLabel];
 
// crea il text input
numero = [[UITextField alloc] initWithFrame:CGRectMake(10, 120, 300, 30)];
numero.borderStyle = UITextBorderStyleRoundedRect;
numero.textAlignment = UITextAlignmentCenter;
numero.keyboardType = UIKeyboardTypeNumberPad;
numero.placeholder = @"Inserisci il numero";
[window addSubview:numero];
 
// crea il bottone
bottone = [UIButton buttonWithType:UIButtonTypeRoundedRect];
bottone.frame = CGRectMake(10, 180, 300, 30);
[bottone setTitle:@"Premi qui" forState:UIControlStateNormal];
[bottone addTarget:self action:@selector(controllaNumero) forControlEvents:UIControlEventTouchUpInside];
[window addSubview:bottone];
 
[myLabel release];
[navigationItem release];
[myNavigationBar release];

Dato che l’applicationDidFinishLaunching corrisponde alla viewDidLoad della scorsa volta, subito dopo il [mainWindow release]; inseriamo:

1
numeroACaso = 1 + arc4random() % 10;

Ora non ci rimane che implementare il metodo controllaNumero, che sarà identico (a parte il prototipo) a quello usato la scorsa volta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void) controllaNumero {
    NSLog(@"Premuto bottone di controlla numero");
    int numeroInserito = [numero.text integerValue];
    NSString *message;
    NSLog(@"Il numero inserito è %d", numeroInserito );
    if( numeroInserito <numeroACaso ) {
        message = @"Troppo basso...";
    } else if (numeroInserito> numeroACaso ) {
        message = @"Troppo alto...";
    } else if (numeroInserito == numeroACaso ) {
        message = @"Bravo hai indovinato";
        numeroACaso = 1 + arc4random() % 10;
        NSLog(@"Numero pensato %d", numeroACaso);
    }
    UIAlertView *alertMessaggio = [[UIAlertView alloc]
                initWithTitle:@"Responso"
                message: message
                delegate:nil
                cancelButtonTitle:@"OK"
                otherButtonTitles:nil];
    [alertMessaggio show];
    [alertMessaggio release];
    numero.text = @"";
}

Abbiamo finito!

Conclusioni e considerazioni

Questo esempio non fa uso diretto di una UIView o di un UIViewController, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Tuttavia inserire gli oggetti direttamente nella window può avere un qualche senso in questo esempio ed in altri sporadici contesti. L’uso delle UIView e dei UIViewController portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro.

Continua...

iPhone FirstApp: indovina il numero – parte 1

Il primo sorgente che mi è passato tra le mani era scritto in Basic e consisteva in poche righe di codice, per me illuminanti. Era un semplice giochino che generava un numero casuale da 1 a 10 e, tramite l’input da tastiera, verificava che il numero inserito era maggione, minore o uguale al numero casuale. Nonostante la sua rozza semplicità rimane, per me, uno dei migliori esempi – semplici, divertenti e pratici – per spiegare a chi non sa nulla di programmazione cosa s’intenda effettivamente per “programma per computer”. Così ho pensato di riproporlo per Apple iPhone, magari aiuterà qualcuno…

Continua...

Very short snippet: shuffle() in Javascript e Actionscript

In PHP esiste una comoda funzione chiamata shuffle() che permette di mescolare un array (vedi Very short trick: prendere elementi casuali da un array in PHP). Un’ottima versione per Javascript l’ho trovata qui. Qui sotto il codice leggermente rivisto:

Continua...

jQuery Simple Slider 1.1.0

Prendendo spunto dal suggerimento di Santino Bivacqua ho inserito in jQuery Simple Slider la possibilità di impostare per ogni singola slide un timeOut diverso, inserendo nel tag li l’attributo rel in questo modo:

Continua...

jQuery Simple Slider

jQuery Simple Slider permette di creare velocemente un feature slide show a partire da una semplice lista UL/LI:

Continua...

jQuery footer caption Plugin: aggiungere didascalie alle immagini

jquery.footercaption.js è un Plugin per jQuery in grado di aggiungere dinamicamente delle didascalie alle immagini e ad altri elementi della pagina (clicca qui per una demo).

Continua...

Undolibrary MatrixArray: un’estensione della classe Array

MatrixArray è un’estensione della classe Array di Actionscript 3.0, con lo scopo di semplificare la manipolazione di Array lineari usati come matrice n x m. Questa classe fa parte della libreria Undolibrary (nel package undolibrary.utils.MatrixArray) che potete scaricaricare liberamente da Google code tramite un qualsiasi client SVN (Subversion) all’indirizzo:
svn checkout http://undolibrary.googlecode.com/svn/trunk/
In alternativa potete scaricare il solo file MatrixArray.as. Un’esempio dell’uso di matrici lineari è stato dato in Actionscript 3.0 for beginners: lesson #2 dove abbiamo visto un suo semplice uso nella realizzazione del classico game Tic Tac Toe. Una matrice di questo tipo è paragonabile ad un’area rettangolare (wxh), proprio come una scacchiera. Con questa classe è possibile trattare una matrice di questo tipo proprio come un reticolo con delle sue coordinate x ed y. La MatrixArray l’ho usata, ad esempio, nello sviluppo di tutta la logica dell’editor di Emotions Icons per Skype: Skypemote.

Continua...

Creare un preloader generico in Actionscript 3.0

Potrebbe sembrare un argomento scontato e ormai esaurito, eppure con Flash CS3 e la nuova gestione della classi documento (package) permesse con Actionscript 3.0, non è del tutto immediato creare un preloader funzionante. L’ultima release di Flash, infatti, gestisce il caricamento del filmato in modo diverso dalle precedenti versioni. In rete potrete trovare diverse proposte e soluzioni per ricreare un preloader “vecchio stampo”. Tuttavia i vari esempi che ho trovato non mi soddisfano pienamente in quanto richiedono di alterare il filmato in modo da farlo funzionare come un preloader classico. In pratica quando si sviluppa bisogna sempre rammentare “questa cosa la devo fare così altrimenti il preload non funziona”! E per i filmati già compilati, poi?

Loader

La soluzione che ho adottato, almeno per adesso, è stata quella di creare un filmato esterno (il mio loader – vedi esempio) in grado di caricare qualsiasi altro filmato esterno, compresa un’immagine! Questa soluzione, nonostante richieda in pratica due filmati (il loader e il filamato vero e proprio), diventa economica solo se si riesce a creare un loader in grado di essere usato più e più volte; cioè in grado di caricare qualsiasi filmato, a qualsiasi risoluzione e a qualsiasi framerate.

Continua...

Reflex e ReflexMe: da Classe base a Classe

Nel post Flash CS3: creare un effetto Reflex su qualsiasi MovieClip avevamo visto com’è possibile scrivere una classe, che estende un MovieClip, per collegarla a DesignTime ad un qualsiasi MovieClip in libreria. Ho scoperto, tuttavia, che può risultare più utile ed economico fare il percorso contrario. Ho creato una classe Reflex (Reflex.as), con l’intenzione di usarla esclusivamente da codice. Ho creato questa classe pensando di passare nel costruttore il puntatore ad un MovieClip. La nuova classe Reflex contiene in sostanza lo stesso codice prima inserito nella ReflexMe, ma leggermente modificato in modo da poter funzionare espressamente da codice:

1
2
3
4
//
import undolibrary.sfx.*;
//
var rx:Reflex = new Reflex( movieClipInstance );

Continua...

Papervision3D: effetti con perlinNoise()

Sfruttando l’effetto generato da perlinNoise() è possibile creare effetti di increspatura e onde con Papervision3D.

Scarica il sorgente

Continua...



Stop SOPA