Salve ragazzi, sono David Pollak e oggi in questo tutorial vi farò vedere come far apparire un oggetto in una posizione random all’interno della vostra View. Tutto questo vi potrà tornare utile, ad esempio, nella creazione di giochi o altri tipi di applicazioni ,proprio recentemente, infatti, ho usato questo codice che mi è servito per realizzare un semplice giochino per iPad che presto vedrà luce in AppStore. Il codice che sto per mostrarvi è abbastanza semplice da capire: in parole povere usiamo 2 file .txt contenenti numeri da 0 a 320 in uno, e da 0 a 480 l’altro (su iPad da 0 a 768 e da 0 a 1024), questi sono di fatto i pixel della risoluzione dei nostri devices da cui estrarremo casualmente un numero per file da usare nei 2 assi (x ed y). Potrete posizionare qualsiasi tipo di oggetto grafico (bottone, immagine, etc). Oggi andremo a posizionare una piccola immagine.
Partiamo con il nostro progetto Xcode
Prima di tutto dobbiamo creare i 2 file di testo .txt con tutti i pixels possibili, io ne ho già usati due per i miei fini quindi faccio che allegarveli qui, non crediate che li abbia scritti io, ho trovato un utilissimo sito che lo ha fatto al posto mio 😛 !
Fattori X iPhone
Fattori Y iPhone
Una volta scaricati i file apriamo XCode, creiamo un nuovo progetto di tipo “view-based application” che chiameremo “RandomPos” e salviamolo da qualche parte (sulla scrivania andrà benissimo). Trascinate quindi i due file con i fattori x e y nella cartella Resources del vostro progetto spuntando l’opzione “Copy items into destination group’s folder (if needed)”.
Passiamo quindi a scrivere un po’ di codice iniziando dal file di intestazione (.h). Dichiariamo quindi variabili ed oggetti:
#import
@interface RandomPosViewController : UIViewController {
IBOutlet UIImageView *immagine;
NSMutableArray *fattoriX;
NSMutableArray *fattoriY;
float x;
float y;
NSString *stringa;
NSString *stringa02;
}
- (IBAction)cambiaPosizione;
@end
Abbiamo semplicemente dichiarato un’UIImageView, due array contenenti i vari fattori, 2 variabili di tipo float (x,y), due NSString che ci serviranno per randomizzare gli elementi provenienti dai due file di testo (.txt), e logicamente un’IBAction per far cambiare la posizione alla nostra immagine.
Come immagine ho creato una sempicissima pallina che vi allego per comodità:

Ed ora iniziamo ad implementare un po’ di codice. Apriamo il file .m e modifichiamolo come segue:
Prima di tutto scommentiamo il metodo viewDidLoad che si trova in basso, togliendo semplicemente /* dall’inizio e */ dalla fine, vi accorgerete che il testo da verde assumerà i classici colori di XCode.
A questo punto andremo a modificare il metodo in questo modo:
- (void)viewDidLoad {
[super viewDidLoad];
NSBundle *bundle = [NSBundle mainBundle];
NSString *percorso = [bundle pathForResource:@"fattoriX-iphone" ofType:@"txt"];
NSString *contenuto = [NSString stringWithContentsOfFile:percorso encoding:NSUTF8StringEncoding error:nil];
fattoriX = [[NSMutableArray alloc] initWithArray:[contenuto componentsSeparatedByString:@"\n++"]];
NSBundle *bundle2 = [NSBundle mainBundle];
NSString *percorso2 = [bundle2 pathForResource:@"fattoriY-iphone" ofType:@"txt"];
NSString *contenuto2 = [NSString stringWithContentsOfFile:percorso2 encoding:NSUTF8StringEncoding error:nil];
fattoriY = [[NSMutableArray alloc] initWithArray:[contenuto2 componentsSeparatedByString:@"\n++"]];
}
Come potete notare abbiamo inserito la stessa cosa due volte, perchè ciò che stiamo facendo è importare tutti gli elementi contenuti nei nostri file .txt verso le due NSMutableArray per poi utilizzarli. Analizzeremo il primo.
Abbiamo dichiarato un oggetto di tipo NSBundle indicandolo come mainBundle, ovvero diciamo di andare a prendere il file nella directory principale; in seguito con l’oggetto percorso di tipo NSString, diamo il nome ed il formato del file che prendiamo e con l’altra NSString creiamo una stringa che prende il contenuto del file nel percorso con l’encoding NSUTF8StringEncoding, poi settiamo l’errore su nil, dato che non ci interessa. Nell’ultima riga di codice inizializziamo l’array fattoriX con il contenuto della stringa precedente (contenuto) e diciamo che gli elementi dell’array sono separati da un invio e ++ (ho messo cosi’ per evitare spiacevoli errori e confusioni).
A questo punto ecco il codice per la nostra azione:
- (IBAction)cambiaPosizione{
int lunghezza = [fattoriX count];
int selezione = arc4random() % lunghezza;
stringa = [fattoriX objectAtIndex: selezione];
x = [stringa floatValue];
int lunghezza02 = [fattoriY count];
int selezione02 = arc4random() % lunghezza02;
stringa02 = [fattoriY objectAtIndex: selezione02];
y = [stringa02 floatValue];
immagine.center = CGPointMake(x, y);
}
Qui andiamo a prendere casualmente i due fattori dagli array in questo modo: con una variabile int (lunghezza) contiamo il numero degli elementi dentro all’array, poi con un’altra variabile (selezione), prendiamo casualmente utilizzando il metodo arc4random() un numero dal conteggio fatto in precendenza e abbiniamo il numero all’elemento che poi inseriamo in una NSString (stringa). Cosi’ abbiniamo le variabili float al valore della NSString.
Come ultima cosa, impostiamo le coordinate del centro della nostra immagine inserendo le 2 variabili.
Con il codice abbiamo finito! Passiamo all’interfaccia grafica.
Creiamo l’interfaccia grafica con Interface Builder
Apriamo il file .xib e creiamo la nostra semplice interfaccia grafica. Inserite un RoundedRectButton che collegherete all’azione cambiaPosizione ed un’UIImageView che collegherete all’outlet immagine.

Abbiamo finito, salviamo tutto, clicchiamo su “Build and Run” ed ecco la nostra nuova app!
Cliccate sul bottone e vedrete che l’immagine si spostera’ casualmente.

Spero che il tutorial vi sia piaciuto e vi sia stato utile, alla prossima !
9 Responses to “T#062 – Mostrare un Oggetto in una Vista in una posizione a Random”
7 Luglio 2010
luca…ma, non capisco…
che utilita’ c’e’ nel dver usare dei file esterni txt che contengono una lista di numeri da 0 a 320 (per la x),
mettere il contenuto dei txt in array,
per poi usare la funzione arc4random() che restituisce un intero, andare a leggere nell’array alla posizione dell’array stesso (che guarda caso e’ lo stesso intero, sotto forma di stringa), e poi usare questo in forma di numero (float in questo caso) per settare la posizione della ns UIImageView…
non ci sono un po’ di passaggi e oggetti inutili?
arc4random() restituisce numeri
CGPointMake() vuole numeri come parametri…
7 Luglio 2010
NeoInteressante, mi serviva qualcosa di simile.. bravo David..
@luca: mah.. probabilmente voleva mostrare nel tutorial altre funzionalità come l’accesso ai file di testo, in fondo si tratta di tutorial fini a se stessi, non di programmi veri e propri con una logica studiata.. Magari postaci due righe di codice.. che potrebbero tornare utili a tutti (a me in particolare :P)
7 Luglio 2010
MacMomoVista la strana “corrispondenza” tra il nome utente dell’autore (bebus77) e il nome con cui si presenta (David Pollak) spero che questo tutorial sia soltanto frutto di una cattiva traduzione, perché così com’è non mi sembra molto utile, anzi.
Va bene sfruttare il tutorial per mostrare alcune funzionalità particolari, ma in questo caso per fare il tutto bastava una sola riga di codice, invece c’è tutto un insieme di roba inutile e fatta male.
7 Luglio 2010
iDevSarebbe sufficiente
immagine.center = CGPointMake(arc4random()%320, arc4random()%480);
Se poi volgiamo essere precisi basta mettere una condizione che verifichi se siamo su iPhone od iPad ed un’altra che verifichi i margini, onde evitare di avere metà pallina fuori dallo schermo quando x=0 o x=320 e y=0 o y=480
7 Luglio 2010
bebus77ragazzi scusate, io l’avevo pensata così, comunque avete ragione, se volete modifico
7 Luglio 2010
TacabrigaMa perchè non fate un bel tutorial per le drill down?
Es. Regioni->citta-vista in dettaglio?
8 Luglio 2010
lucaMa no aspetta, lasciala pure, ora, come ha scritto Neo i tuoi passaggi in piu’ possono servire per mostrare altre funzioni, l’importante e’ dire chiaramente che lo scopo e’ quello, e non lasciar credere che quello e’ il modo migliore per ottenere lo scopo, nel tuo caso:
“…come far apparire un oggetto in una posizione random…”, altrimenti si confondono le idee, invece che chiarirle, come dovrebbe fare un tutorial.
Un altro piccolo “appunto”:
mi capita spesso di trovare tutorial dove si tralascia la gestione della memoria e mancano del tutto “release” degli oggetti “allocati”.
Lo dico perche’ ho “studiato” molto sui tutorial, e la gestione della memoria e’ stata la mia “bestia nera” (come per molti neofiti della programmazione “a oggetti”, e devo dire che ho fatto fatica anche perche’ molti tutorial finivano con frasi “e questo e’ tutto quello che vi serve”, “non vi serve altro”, “tutto qui, facile vero?”… senza la minima gestione della memoria…
Ora io capisco che ogni tutorial si concentra su una piccola parte della programmazione e nn suggerisco di “perder tempo” a spiegare e inserire codice per tutto, pero’ una frase tipo
“ricordatevi di deallocare la memoria” sarebbero gradite, senno’ davvero si confondono le idee (come e’ successo a me, ma forse sono io che sono “lento” ad apprendere).
In ogni caso grazie per il tuo e gli altri tutorial, la mia nn voleva essere una critica, ma un chiarimento/aggiunta al tuo esempio, e’ per questo che si da la possibilita’ a tutti di aggiungere “commenti”, non solo per dire “grazie”…
luca
29 Settembre 2010
MatteoCiao a tutti
Mi sto cimentando solo da poco più di un mese con le app di iphone e Ipad. Forse voi potete aiutarmi. Con la seguente applicazione come posso anche randomizzare le dimensioni della figura?
Grazie mille
Matteo
11 Febbraio 2011
FiliMa usare una srand con range compreso tra 0 e 320/480? Non sarebbe meglio?