• Programmazione Android
  • CORSI ONLINE
  • Web Agency

Logo

Corsi di programmazione web e mobile online
Navigation
  • Home
  • CORSI ONLINE
  • Tutorial Pratici
  • GUIDE COMPLETE
    • Corso completo di C
    • Corso videogame con Cocos2d
    • Programmazione Cocoa Touch
  • Sezioni
    • Libri e manuali
    • Tips & Tricks
    • Risorse utili
    • Strumenti di Sviluppo
    • Materiale OpenSource
    • Framework
    • Guide Teoriche
    • Guide varie
    • Grafica e Design
    • iPad
    • News
    • Video Tutorial
    • Windows Phone
  • Pubblicità
  • About
    • Chi siamo
    • Pubblicazioni
    • Collabora
    • Sostieni devAPP

T#073 – UIProgressView e NSTimer: come creare una semplice barra di caricamento

By Andrea Busi | on 30 Settembre 2010 | 11 Comments
Senza categoria

t073 uiprogressview nstimer barra caricamento iphone ipad sdk 00 Eccoci con un nuovo tutorial semplice semplice. In questo articolo vedremo come implementare un’ “UIProgressBar“, ovvero la barra che si usa per segnalare all’utente il caricamento di un qualche cosa o lo svolgimento di un’azione. Nel nostro caso cambieremo il colore di sfondo della nostra applicazione. Vedremo, quindi, come utilizzare la classe “NSTimer“, ovvero un temporizzatore, che ci permetterà nel nostro caso di eseguire animazioni e transizioni con durata predefinita.

1. Creiamo un nuovo progetto

Aprimo Xcode, selezioniamo “File -> New Project”. Nel menù che ci appare selezioniamo “View-based Application”, clicchiamo su “Choose…” e immettiamo come nome “ProgressColour” e fate clic su “Save”. Abbiamo così creato il nostro nuovo progetto.
t073 uiprogressview nstimer barra caricamento iphone ipad sdk 01
Apriamo il file “ProgressColourViewController.h” e definiamo i seguenti componenti:

#import 

@interface ProgressColourViewController : UIViewController {
	IBOutlet UILabel *progressLabel;
	IBOutlet UIProgressView *progressBar;

	IBOutlet UIButton *bottoneBlu;
	IBOutlet UIButton *bottoneRosso;
}

- (IBAction)caricamentoColore:(id)bottone;

@end

La label definita alla riga 4 servirà per mostrare un messaggio all’utente sul grado di completamento dell’animazione, mentre la UIProgressBar darà la stessa informazioni ma in maniera più visiva (è una classica barra di caricamento). Abbiamo, inoltre, dichiarato anche due bottoni UIButton: vedremo, poi, il perchè di questa dichiarazione.
L’azione alla riga 11 verrà associata ad entrambi i bottoni, infatti sarà questo metodo ad avviare il cambio di colore dello sfondo. Nell’intestazione di questo metodo c’è anche un parametro “bottone” di tipo “id”: questo ci servirà per determinare quale bottone ha invocato il metodo, in modo da poter caricare il colore scelto dall’utente.

Possiamo ora iniziare a definire l’aspetto grafico dell’applicazione, aprendo il file “ProgressColourViewController.xib”.

2. Definiamo l’aspetto grafico dell’applicazione

Inseriamo nella nostra vista i primi due componenti necessari: una UILabel e una UIProgressView. Ricreate una disposizione simile a questa (ovviamente nessuno vi vieta di personalizzarla a vostro piacimento):
t073 uiprogressview nstimer barra caricamento iphone ipad sdk 02
Come potete notare la label e la barra di progresso occupano quasi per intero la larghezza della vista, questo per rendere più evidente ciò che avviene. Selezioniamo la label e apriamo “Attributes Inspector”, per modificare alcune proprietà:

  • cancellate il contenuto del campo “Text”;
  • “Font Size”: 20
  • allineamento centrale.

Selezioniamo ora la UIProgressView e, sempre in “Attributes Inspector”, impostiamo il valore della casella “Progress” a zero. Inseriamo ora nella vista due bottoni, in modo da avere un risultato finale come questo:
t073 uiprogressview nstimer barra caricamento iphone ipad sdk 03
Abbiamo già concluso la creazione della parte grafica della nostra applicazione. Non ci resta che collegare i componenti che abbiamo definito ad inizio tutorial. Dal Pannello dei Documenti selezioniamo, come sempre, il “File’s Owner” e apriamo il “Connections Inspector”. Dovreste avere un pannello così composto:

Colleghiamo l’elemento “progressLabel” con la label vuota presente sopra la barra, e “progressBar” con la barra stessa. Colleghiamo anche gli elementi “bottoneBlu” e “bottoneRosso” con i due relativi pulsanti. Colleghiamo, infine, l’azione “caricamentoColore” con entrambi i bottoni, selezionando “Touch Up Inside” dal menù a tendina che si presenta. Se avete eseguito tutto in maniera corretta dovreste avere questo risultato:

Abbiamo così terminato questa fase. Salviamo e chiudiamo Interface Builder.

3. Scriviamo il codice necessario

Dobbiamo ora definire due elemento e un paio di metodi che non abbiamo scritto inizialmente. Apriamo il file “ProgressColourViewController.h” e inserite le dichiarazioni mancanti:

#import 

@interface ProgressColourViewController : UIViewController {
IBOutlet UILabel *progressLabel;
IBOutlet UIProgressView *progressBar;

IBOutlet UIButton *bottoneBlu;
IBOutlet UIButton *bottoneRosso;

NSTimer *timer;
UIColor *colore;
}

@property (nonatomic, retain) NSTimer *timer;
@property (nonatomic, retain) UIColor *colore;

- (IBAction)caricamentoColore:(id)bottone;
- (void)aggiornaColore ;
- (void)applicaColore ;

@end

Abbiamo definito un componente “NSTimer” (alla riga 10), che sarà il temporizzatore che ci permetterà di eseguire l’animazione prevista. Nella riga successiva è definito un elemento UIColor, che servirà per tener traccia del colore che deve essere applicato allo sfondo.

Sono stati dichiarati, inoltre, due nuovi metodi, che ci serviranno per implementare le azioni necessarie (righe 18 e 19).

Passiamo ora al file “ProgressColourViewController.m” e iniziamo ad implementare i metodi necessari. Inseriamo il seguente codice:

#import "ProgressColourViewController.h"

@implementation ProgressColourViewController

@synthesize timer;
@synthesize colore;

- (IBAction)caricamentoColore:(id)bottone {
	progressBar.progress = 0.0;

	if (bottone == bottoneBlu){
		progressLabel.text = @"Caricamento colore blu...";
		colore = [UIColor blueColor];
	}else if (bottone == bottoneRosso) {
		progressLabel.text = @"Caricamento colore rosso...";
		colore = [UIColor redColor];
	}
	timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(aggiornaColore) userInfo:nil repeats:YES];
}

Questo metodo si occupa di avviare il caricamento del colore scelto dall’utente. Alla riga 9 viene settato il valore di progresso della barra a zero (tale valore di default va da 0.0 a 1.0, ma questo intervallo può essere modificato a piacere). Troviamo, poi, un controllo sul bottone che ha invocato il metodo (riga 10): se il bottone premuto dall’utente è quello per il colore blu, impostiamo la label indicando che viene caricato il blu, e assegniamo alla variabile “colore” il valore “[UIColor blueColor]”. Questo è un elemento predefinito della classe UIColor, che ci permette di utilizzare colori standard in maniera semplice e veloce. Nello stesso modo lavora la clausola “else if”, ovviamente controllando se il bottone premuto è quello per il colore rosso.

Alla riga 17, infine, viene definita la variabile timer, istanziandola con la classe NSTimer. Ci sono tre parametri molto importanti in questa funzione: la durata di 1 secondo (alla clausola “scheduledTimerWithTimeInterval”), il metodo che deve essere eseguito ad ogni ripetizione (clausola “@selector()”) e la ripetizione continua di tale intervallo di tempo (impostata tramite “repeats:YES“).

Proseguiamo con la definizione dei metodi:

- (void)aggiornaColore {
	progressBar.progress = progressBar.progress + 0.1;
	if (progressBar.progress == 0.5){
		progressLabel.text = @"Applicando colore…";
		[self applicaColore];
	}
	if (progressBar.progress == 1.0){
		progressLabel.text = @"Colore applicato!";
		[timer invalidate];
	}
}

Alla riga 2 incrementiamo il valore della nostra barra di progresso, aumentandone il valore del 10%. Alla riga 3 troviamo un controllo if, che verifica se il valore della barra è 0.5 (ovvero siamo a metà): in caso affermativo, cambiamo il testo presente nella label, altrimenti lasciamo tutto invariato. Anche alla riga 7 un ciclo if controlla se la barra di progresso è arrivata al suo valore massimo: in tal caso inseriamo un nuovo testo nella label, e fermiamo il timer (con l’istruzione alla riga 9).

Nel primo ciclo if che abbiamo esaminato, notiamo che alla riga 5 viene richiamato il metodo “applicaColore”: tale metodo avrà il compito di cambiare il colore allo sfondo della vista, con un’animazione che dovrà durare 5 secondi (infatti siamo al 50% del progresso, e la barra avanza del 10% ogni secondo). Ecco tale metodo:

- (void)applicaColore {
	[UIView beginAnimations:nil context:NULL];
	[UIView setAnimationDuration:5.0];
	self.view.backgroundColor = colore;
	[UIView commitAnimations];
}

In questi metodo viene definita l’animazione che permette allo sfondo della nostra vista di cambiare colore. Alla riga 3 definiamo la durata di tale animazione (5 secondi); l’istruzione successiva è il risultato che vogliamo ottenere, ovvero il nostro colore di sfondo. Notate che il colore è quello della variabile “colore” (scusate il gioco di parole), che abbiamo settato nel metodo “caricamentoColore”. Chiude il gruppo di istruzioni la riga 5, che avvia l’animazione.

Clicchiamo su “Build and Go!” e testiamo la nostra applicazione!

t073 uiprogressview nstimer barra caricamento iphone ipad sdk 06 t073 uiprogressview nstimer barra caricamento iphone ipad sdk 07

Se avete problemi con il tutorial, questo è il nostro file di progetto.

Share this story:
  • tweet

Tags: andrea busiNSTimerscheduledTimerWithTimeIntervalTutorial PraticiUILabelUIProgressBaruiprogressview

Recent Posts

  • Parte il percorso programmatori iOS in Swift su devACADEMY.it

    20 Dicembre 2017 - 0 Comment
  • Android, crittografare dati velocemente con Encryption

    24 Settembre 2018 - 0 Comment
  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • Okio, libreria per ottimizzare l’input/output in Java

    27 Agosto 2018 - 0 Comment

Related Posts

  • “Tutorial pratici per iOS SDK” si aggiorna alla versione 2.1

    10 Maggio 2012 - 1 Comment
  • Tutorial pratici per iOS SDK: disponibile la versione 2.0 aggiornata a iOS 5 e XCode 4.2

    16 Novembre 2011 - 6 Comments
  • T#097 – Animiamo il testo all’interno di un’UILabel

    17 Giugno 2011 - 17 Comments

Author Description

23 anni, è studente di Ingegneria Informatica presso l’Università di Bergamo (laurea Magistrale). Appassionato d’informatica sin da bambino, conosce molto bene il C++, Java e l'ObjectiveC, con cui ormai programma con successo da qualche anno. Ha già scritto un ebook “Tutorial pratici per iPhone SDK”, che ha avuto un ottimo successo, e gestisce da quasi due anni BubiDevs, un piccolo blog che ha dato l’ispirazione anche a devAPP.

11 Responses to “T#073 – UIProgressView e NSTimer: come creare una semplice barra di caricamento”

  1. 30 Settembre 2010

    Tweets that mention UIProgressView e NSTimer: creare una barra di caricamento nelle nostre applicazioni iPhone | devAPP -- Topsy.com

    […] This post was mentioned on Twitter by Rynox, iPadWorld.it and devAPP, Bubi Devs. Bubi Devs said: T#073 – UIProgressView e NSTimer: come creare una semplice barra di caricamento: Eccoci con un nuovo tutorial semp… http://bit.ly/9NbyL7 […]

  2. 1 Ottobre 2010

    Nicola

    Molto interessante! Mi chiedo però se non fosse stato più efficiente nonché più elegante implementare tutti metodi di questo tutorial parametrizzandoli: ad esempio:

    (void)applicaColore: (UIColor)color {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:5.0];
    // ‘if’ opzionale
    if(color == [UIColor redColor] || color == [UIColor blueColor]) {
    self.view.backgroundColor = color;
    [UIView commitAnimations];
    }
    }

    con la relativa chiamata:

    – (void)aggiornaColore: (UIColor)color {
    UIColor *thisColor = color; // Blu o Rosso
    progressBar.progress = progressBar.progress + 0.1;
    if (progressBar.progress == 0.5){
    progressLabel.text = @”Applicando colore…”;
    [self applicaColore:thisColor];
    }
    if (progressBar.progress == 1.0){
    progressLabel.text = @”Colore applicato!”;
    [timer invalidate];
    }
    }

    ed infine ‘caricamentoColore’:

    – (IBAction)caricamentoColore {
    progressBar.progress = 0.0;
    progressLabel.text = @”Caricamento colore…”;
    if(this.view.backgroundColor == [UIColor blueColor]) {
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(aggiornaColore:redColor) userInfo:nil repeats:YES];
    }
    else
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(aggiornaColore:blueColor) userInfo:nil repeats:YES];
    }

    Insomma una cosa del genere….dici che potrebbe andare? A mio avviso si risparmia un sacco di tempo e codice per metodi e outlets.
    Preciso che ho scritto queste righe al volo e da Windows, quindi non garantisco la correttezza.

  3. 1 Ottobre 2010

    Nicola

    Naturalmente in ‘caricamentoColore’ vanno scambiati i corpi nell’ if-else..

  4. 1 Ottobre 2010

    Andrea Busi


    Nicola:

    Naturalmente in ‘caricamentoColore’ vanno scambiati i corpi nell’ if-else..

    ciao, certamente, la soluzione del tutorial non è la migliore, però forse è la più facile per chi è alle prima armi..

    sicuramente le varie funzioni possono essere parametrizzate e ottimizzate, risparmiando righe di codice (ma non efficienza del programma 😉 )

  5. 2 Ottobre 2010

    Nicola

    Mah Andrea, non so se è la più facile considerati i disagi che provoca questa pratica di programmazione a lungo termine. Se una persona si abitua a programmare in questo modo prima o poi avrá seri problemi di estendibilità e leggibilità; poi boh, non mi sembra di aver scritto codice di più difficile interpretazione del tuo, le modifiche sono davvero minime seppur sostanziali…

  6. 2 Ottobre 2010

    Andrea Busi


    Nicola:

    Mah Andrea, non so se è la più facile considerati i disagi che provoca questa pratica di programmazione a lungo termine. Se una persona si abitua a programmare in questo modo prima o poi avrá seri problemi di estendibilità e leggibilità; poi boh, non mi sembra di aver scritto codice di più difficile interpretazione del tuo, le modifiche sono davvero minime seppur sostanziali…

    si si, ma infatti non ho detto questo io xD

    la tecnica migliore è sicuramente quella di rendere le funzioni generiche e di non duplicare il codice, cosa che non è stata fatta nel tutorial (abbastanza vecchiotto tra l’altro)..

    appena ho tempo vedrò di sistemarlo e renderlo più corretto 😉

  7. 4 Ottobre 2010

    Andrea Busi

    Tutorial rivisto e corretto, ora il codice è più generalizzato 😉

    Grazie a Nicola e a tutti quelli che me lo hanno segnalato via mail 😉

  8. 4 Ottobre 2010

    Nicola

    E’ un piacere! 😉

    Andrea sai mica come personalizzare una tabella come quella della ricerca spotlight in iOS? La userei ma non so da dove partire per personalizzarla! Magari un tutorial su questo sarebbe magnifico, se non è di troppo impegno!
    PS: anche se da dietro le quinte, ti seguo sempre!

  9. 4 Ottobre 2010

    Andrea Busi


    Nicola:

    E’ un piacere! ;)

    Andrea sai mica come personalizzare una tabella come quella della ricerca spotlight in iOS? La userei ma non so da dove partire per personalizzarla! Magari un tutorial su questo sarebbe magnifico, se non è di troppo impegno!
    PS: anche se da dietro le quinte, ti seguo sempre!

    il piacere è nostro vedendo che gli utenti partecipano attivamente al blog 😉

    per quanto riguarda le tabelle con celle personalizzate puoi analizzare questo tutorial: http://www.devapp.it/wordpress/t050-creiamo-un-client-twitter-per-iphone-parte-2.html

    comunque siete in tanti a fare richieste sulle celle personalizzate, vedremo di fare anche un nuovo tutorial 😉

  10. 6 Ottobre 2010

    Nicola

    Ci avevo già dato un’ occhiata in passato…il fatto è che ho già buona dimestichezza con le celle personalizzate, ma ciò che io cercavo non riguardava solo queste, bensì qualcosa di più generale. Ad esempio, la tabella che esce fuori digitando qualcosa in spotlight implementa lo stesso comportamento dei contatti, in cui l’ intestazione della tabella (che è una grouped table) di un gruppo di contatti rimane fissa al top dello schermo finchè ci sono elementi in quella sezione, dopodichè scorre. Lo stesso comportamento si ha nella tabella spotlight, in cui l’ icona del file rimane fissa finchè ci sono elementi da scorrere appartenenti a quel tipo di file. Credo che ci sia in gioco l’ereditarietà con l’ applicazione contatti, ma non riesco a focalizzare bene il problema. So che non è facile capire bene cosa intendo semplicemente leggendo, bisognerebbe studiarla attentamente dal proprio iPhone. E’ una tabella davvero interessante, quella…merita sicuramente attenzione anche perchè porta dietro di sè praticamente tutti i concetti relativi alla programmazione delle tabelle (immagini nelle celle, celle personalizzate, ereditarietà di comportamenti, ecc..)

  11. 6 Aprile 2013

    DevTutorial #5 – UIProgressView e NSTimer: come creare una semplice barra di caricamento - Bubi Devs

    […] Leggi il tutorial completo su devAPP […]

Leave a Reply

Your email address will not be published. Required fields are marked *


*
*

Corso online di programmazione android e java

SEZIONI

  • Android
  • Comunicazioni
  • Contest
  • Corsi ed Eventi
  • Corso completo di C
  • Corso programmazione videogiochi
  • Framework
  • Grafica e Design
  • Guida rapida alla programmazione Cocoa Touch
  • Guide Teoriche
  • Guide varie
  • iPad
  • Le nostre applicazioni
  • Libri e manuali
  • Materiale OpenSource
  • News
  • Pillole di C++
  • Progetti completi
  • Risorse utili
  • Strumenti di Sviluppo
  • Swift
  • Tips & Tricks
  • Tutorial Pratici
  • Video Tutorial
  • Windows Phone

Siti Amici

  • Adrirobot
  • Allmobileworld
  • Apple Notizie
  • Apple Tribù
  • Avvocato360
  • Blog informatico 360°
  • bubi devs
  • fotogriPhone
  • GiovaTech
  • iApp-Mac
  • iOS Developer Program
  • iPodMania
  • MelaRumors
  • Meritocracy
  • SoloTablet
  • TecnoUser
  • Privacy & Cookie Policy
©2009-2018 devAPP - All Rights Reserved | Contattaci
devAPP.it è un progetto di DEVAPP S.R.L. - Web & Mobile Agency di Torino
Str. Volpiano, 54 - 10040 Leini (TO) - C.F. e P.IVA 11263180017 - REA TO1199665 - Cap. Soc. € 10.000,00 i.v.

devACADEMY.it

Vuoi imparare a programmare?

Iscriviti e accedi a TUTTI i corsi con un’unica iscrizione.
Oltre 70 corsi e migliaia di videolezioni online e in italiano a tua disposizione.

ISCRIVITI SUBITO