{"id":6994,"date":"2011-06-03T21:15:05","date_gmt":"2011-06-03T19:15:05","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6994"},"modified":"2011-06-05T12:30:21","modified_gmt":"2011-06-05T10:30:21","slug":"t094-creare-un-contatore-meccanico-animato-per-iphone-o-ipad","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t094-creare-un-contatore-meccanico-animato-per-iphone-o-ipad\/","title":{"rendered":"T#094 &#8211; Creare un contatore meccanico animato per iPhone o iPad"},"content":{"rendered":"<p>Buongiorno a tutti! Il corso di C mi ha tenuto parecchio impegnato ed \u00e8 da un p\u00f2 che non scrivo tutorial per iOS, ma oggi ho una piccola chicca da proporvi.<br \/>\nL&#8217;obbiettivo di oggi \u00e8 quello di realizzare un contatore meccanico, simile a quello che si vede in molti giochi, con tanto di animazione per passare da un numero ad un altro.<br \/>\nIn questa immagine si vede l&#8217;effetto finale da &#8220;fermo&#8221;  e durante un&#8217;animazione (a fondo articolo trovate anche un video con il contatore all&#8217;opera):<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-01.jpg\" alt=\"Creare-un-contatore-animato-per-iPhone-iPad-01\" title=\"Creare-un-contatore-animato-per-iPhone-iPad-01\" width=\"275\" height=\"517\" class=\"alignnone size-full wp-image-6997\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-01.jpg 275w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-01-159x300.jpg 159w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-01-79x150.jpg 79w\" sizes=\"auto, (max-width: 275px) 100vw, 275px\" \/><\/a> <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-02.jpg\" alt=\"Creare-un-contatore-animato-per-iPhone-iPad-02\" title=\"Creare-un-contatore-animato-per-iPhone-iPad-02\" width=\"275\" height=\"517\" class=\"alignnone size-full wp-image-6998\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-02.jpg 275w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-02-159x300.jpg 159w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-02-79x150.jpg 79w\" sizes=\"auto, (max-width: 275px) 100vw, 275px\" \/><\/a><br \/>\n<\/center><!--more--><\/p>\n<p>Come sempre cercheremo di creare del codice che sia riutilizzabile in diverse occasioni quindi una volta realizzato questo tutorial non vi rester\u00e0 altro da fare che copiare i file nel vostro progetto ed interagire con il contatore come si fa con qualsiasi altro oggetto dell&#8217;UIKit.<br \/>\nPer iniziare abbiamo bisogno delle immagini per il nostro contatore, potete realizzarle con photoshop, potete comprarle online oppure ancora potete anche usare le mie se vi piacciono. Nel progetto allegato le troverete gi\u00e0 separate, non impazzite a tagliare queste:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-03.png\" alt=\"Creare-un-contatore-animato-per-iPhone-iPad-03\" title=\"Creare-un-contatore-animato-per-iPhone-iPad-03\" width=\"550\" height=\"100\" class=\"aligncenter size-full wp-image-6999\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-03.png 680w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-03-300x54.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-03-150x27.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Adesso qui si svela il primo trucco, le immagini che serviranno saranno 20 e non 10 come si potrebbe pensare all&#8217;inizio, perch\u00e9 ci serviranno delle imagini per l&#8217;animazione.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-04.png\" alt=\"Creare-un-contatore-animato-per-iPhone-iPad-04\" title=\"Creare-un-contatore-animato-per-iPhone-iPad-04\" width=\"550\" height=\"100\" class=\"aligncenter size-full wp-image-7000\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-04.png 680w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-04-300x54.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-04-150x27.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Io ho cercato con photoshop di dare l&#8217;effetto &#8220;movimento&#8221; inserendo due numeri per volta con una sfocatura verticale. Ad essere sincero questa idea non \u00e8 tutta farina del mio sacco, ma l&#8217;idea mi \u00e8 venuta giocando a Flight Control, infatti come potete vedere in questo screen sul loro gioco utilizzano proprio questa tecnica:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-06.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-06.jpg\" alt=\"Creare-un-contatore-animato-per-iPhone-iPad-06\" title=\"Creare-un-contatore-animato-per-iPhone-iPad-06\" width=\"550\" height=\"367\" class=\"aligncenter size-full wp-image-7003\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-06.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-06-300x200.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-06-150x100.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Un&#8217;aspetto da non sottovalutare \u00e8 la naming convention, ossia i nomi da dare ai file, sar\u00e0 importante chiamare le immagini con dei nomi come &#8220;immagine_0.png&#8221;, &#8220;&#8221;immagine_1.png&#8221; etc.<br \/>\nio ho usato   da &#8220;mc_0.png&#8221; fino a &#8220;mc_9.png&#8221; per le immagini delle singole cifre, e da &#8220;mc_10.png&#8221; fino a &#8220;mc_20&#8221; per le altre 10 immagini.<\/p>\n<p>Realizzate quindi le immagini non ci resta che passare ad xcode, create quindi un nuovo progetto ed importate le immagini che avete creato.<br \/>\nIo per semplicit\u00e0 ho creato un progetto di tipo &#8220;ViewBased application&#8221; e nel metodo &#8220;viewDidLoad&#8221; del viewcontroller principale ho inserito questo codice per generare lo sfondo ed il pulsante:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n   \r\n[super viewDidLoad];\r\n        \/* Creazione dello sfondo\r\n         *\/\r\nUIImageView *bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@\"sfondo_devapp.png\"]];\r\n        [bg setFrame:[[UIScreen mainScreen] bounds]];\r\n        [self.view addSubview:bg];\r\n        [bg release];\r\n        \r\n        \r\n        \/* Creazione del pulsante\r\n         *\/\r\n        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];\r\n        [btn setFrame:CGRectMake(160 - 150 \/ 2, 230 - 60 \/ 2, 150, 60)];\r\n        [btn setBackgroundImage:[UIImage imageNamed:@\"button.png\"] forState:UIControlStateNormal];\r\n        [btn setTitle:@\"TAP ME!\" forState:UIControlStateNormal];\r\n        [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];\r\n        [self.view addSubview:btn];\r\n<\/pre>\n<p>Questo codice \u00e8 stato inserito solo per completezza e non ha direttamente a che vedere con il nostro contatore.<\/p>\n<p>Arriviamo quindi al cuore del progetto, realizziamo la nostra classe &#8220;MechanicalCounter&#8221; creando una nuova classe che derivi direttamente da uiview.<br \/>\nLa dichiarazione della classe \u00e8 la seguente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface MechanicalCounter : UIView {\r\n        NSMutableArray *ciphers;\r\n        int currentValue;\r\n        int *values;\r\n}\r\n\r\n@property (nonatomic, retain) NSMutableArray *ciphers;\r\n@property (nonatomic, assign) int currentValue;\r\n\r\n- (id)initWithFrame:(CGRect)frame andCiphers:(int)nchipers;\r\n- (void)setValue:(int)newValue;\r\n- (void)showNextValue;\r\n\r\n@end\r\n<\/pre>\n<p>Ho dichiarato e variabili di istanza, la prima \u00e8 un NSMutableArray, conterr\u00e0 le UIImageView del nostro contatore, la seconda variabile \u00e8 un intero che contiene il valore attualmente visualizzato sul contatore mentre l&#8217;ultima variabile \u00e8 un puntatore ad intero, verr\u00e0 usata per costruire un semplice array in puro stile C. Questo array conterr\u00e0 in ogni posizione il valore della cifra corrispondente visualizzata nel contatore.<br \/>\nFacciamo un piccolo esempio: supponiamo che il contatore visualizzi 001234, l&#8217;array conterr\u00e0 6 uiimageview, la variabile currentValue conterr\u00e0 il valore 1234, mentre l&#8217;array values sar\u00e0 cos\u00ec:<\/p>\n<p>values[0] = 0;<br \/>\nvalues[1] = 0;<br \/>\nvalues[2] = 1;<br \/>\nvalues[3] = 2;<br \/>\nvalues[4] = 3<br \/>\nvalues[5] = 4;<\/p>\n<p>Perch\u00e8 uso un array C invece di un NSArray? Perch\u00e9 negli NSArray non si possono inserire variabili di tipo int, quindi dovrei passare da nsnumber e lo ritengo un&#8217;inutile spreco di spazio.<\/p>\n<p>Guardiamo quindi il primo metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(id)initWithFrame:(CGRect)frame andCiphers:(int)nciphers {\r\n        self = [super initWithFrame:frame];\r\n        if (self) {\r\n                self.ciphers = [NSMutableArray arrayWithCapacity:nciphers];\r\n                values = calloc(nciphers, sizeof(int));\r\n                \r\n                \/* Calcolo la dimensione in larghezza\r\n                 *\/\r\n                UIImage *imgtest = [UIImage imageNamed:@\"mc_0.png\"];\r\n                float width;\r\n                if (imgtest.size.width * nciphers > 320) {\r\n                        width = 320 \/ nciphers;\r\n                }\r\n                else {\r\n                        width = frame.size.width \/ nciphers;\r\n                }\r\n                \r\n                \r\n                \/* Calcolo l'array delle immagini per l'animazione\r\n                 *\/\r\n                NSMutableArray *arr = [NSMutableArray arrayWithCapacity:10];\r\n                for (int i = 10; i <= 19; i++) {\r\n                        NSString *str = [NSString stringWithFormat:@\"mc_%d.png\",i];\r\n                        [arr addObject:[UIImage imageNamed:str]];\r\n                }\r\n                \r\n                \r\n                \/* Istanzio le singole view\r\n                 *\/\r\n                for (int i = 0; i < nciphers; i++) {\r\n                        UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(i * width, 0, width, frame.size.height)];\r\n                        [v setImage:imgtest];\r\n                        v.contentMode = UIViewContentModeScaleAspectFit;\r\n                        [v setAnimationImages:arr];\r\n                        [v setAnimationRepeatCount:1];\r\n                        [v setAnimationDuration:0.5];\r\n                        [ciphers addObject:v];\r\n                        [self addSubview:v];\r\n                        [v release];\r\n                }\r\n        }\r\n        return self;\r\n}\r\n<\/pre>\n<p>Questo metodo \u00e8 il costruttore principale della nostra classe, lo invochiamo passando il frame in cui vogliamo visualizzare il contatore ed il numero di cifre che devono essere visualizzate.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nself.ciphers = [NSMutableArray arrayWithCapacity:nciphers];\r\nvalues = calloc(nciphers, sizeof(int));\r\n<\/pre>\n<p>Iniziamo quindi con il richiamare il costruttore della classe super e se tutto \u00e8 andato per il verso giusto proseguiamo inizializzando l'array ciphers e l'array values.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nUIImage *imgtest = [UIImage imageNamed:@\"mc_0.png\"];\r\n                float width;\r\n                if (imgtest.size.width * nciphers > 320) {\r\n                        width = 320 \/ nciphers;\r\n                }\r\n                else {\r\n                width = frame.size.width \/ nciphers;\r\n}\r\n<\/pre>\n<p>Segue un piccolo calcolo per ottenere la larghezza di ogni singola cifra, notare che se il numero delle cifre moltiplicato per la larghezza della singola immagine supera la dimensione dello schermo, tutto viene ridimensionato per far rientrare tutto il contatore entro i 320px dell'iphone.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/* Calcolo l'array delle immagini per l'animazione\r\n                 *\/\r\n                NSMutableArray *arr = [NSMutableArray arrayWithCapacity:10];\r\n                for (int i = 10; i <= 19; i++) {\r\n                        NSString *str = [NSString stringWithFormat:@\"mc_%d.png\",i];\r\n                        [arr addObject:[UIImage imageNamed:str]];\r\n                }\r\n<\/pre>\n<p>Creo un array con le uiimage che comporranno la mia animazione, lo creo solo una volta e lo associo a tutte le uiimageview.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/* Istanzio le singole view\r\n                 *\/\r\n                for (int i = 0; i < nciphers; i++) {\r\n                        UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(i * width, 0, width, frame.size.height)];\r\n                        [v setImage:imgtest];\r\n                        v.contentMode = UIViewContentModeScaleAspectFit;\r\n                        [v setAnimationImages:arr];\r\n                        [v setAnimationRepeatCount:1];\r\n                        [v setAnimationDuration:0.5];\r\n                        [ciphers addObject:v];\r\n                        [self addSubview:v];\r\n                        [v release];\r\n                }\r\n        }\r\n<\/pre>\n<p>Creo infine tutte le UIView che mi serviranno, e per ciascuna di esse imposto tutti i parametri necessari per l'animazione.<\/p>\n<p>A questo punto l'inizializzazione \u00e8 terminata, questo oggetto pu\u00f2 essere gestito come tutti gli altri oggetti dell'UIKit, infatti tornando al viewcontroller principale, sempre nel metodo viewdidiload possiamo aggiungere:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/mc \u00e8 una variabile di tipo MechanicalCounter dichiarata nel file .h        \r\nmc = [[MechanicalCounter alloc] initWithFrame:CGRectMake(0, 0, 320, 124) andCiphers:10];\r\n        [self.view addSubview:mc];\r\n<\/pre>\n<p>per vedere questo risultato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-05.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-05.jpg\" alt=\"Creare-un-contatore-animato-per-iPhone-iPad-05\" title=\"Creare-un-contatore-animato-per-iPhone-iPad-05\" width=\"438\" height=\"175\" class=\"aligncenter size-full wp-image-7001\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-05.jpg 438w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-05-300x119.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/Creare-un-contatore-animato-per-iPhone-iPad-05-150x59.jpg 150w\" sizes=\"auto, (max-width: 438px) 100vw, 438px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Ma ovviamente non \u00e8 solo questo quello che ci aspettiamo, ci serve un contatore che \"conti\" :D, quindi rimbocchiamoci le maniche ed implementiamo i restanti due metodi dichirati nel file .h<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)setValue:(int)newValue;\r\n- (void)showNextValue;\r\n<\/pre>\n<p>Partirei dal secondo, la cui implementazione \u00e8 banale:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)showNextValue {\r\n        [self setValue:++self.currentValue];        \r\n}\r\n<\/pre>\n<p>Quello che fa questo metodo \u00e8 richiamare un ulteriore metodo, che non \u00e8 dichiarato nel file .h e quindi si potrebbe definire \"privato\" passando come parametro il valore della variabile currentValue incrementato di 1.<br \/>\nAnche il primo metodo se vogliamo \u00e8 piuttosto semplice perch\u00e9 la sua implementazione \u00e8 questa:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)setCurrentValue:(int)acurrentValue {\r\n        currentValue = acurrentValue;\r\n        [self setValue:self.currentValue];\r\n}\r\n<\/pre>\n<p>Si occupa di impostare correttamente la variabiel currentValue e richiamare lo stesso metodo privato del precedente.<\/p>\n<p>A questo punto allora bisogna capire cosa fa questo metodo <em>setValue:<\/em> !!<\/p>\n<p>Il codice \u00e8 questo, c'\u00e8 un p\u00f2 di matematica, ma niente paura:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)setValue:(int)newValue {\r\n        if (newValue > (pow(10, [ciphers count]) - 1)) {\r\n                if (newValue == (pow(10, [ciphers count]))) {\r\n                        newValue = 0;\r\n                        currentValue = 0;\r\n                }\r\n                else {\r\n                        NSLog(@\"Error: value too high\");\r\n                        return;\r\n                }\r\n        }\r\n        int cifra;\r\n        for (int i = [ciphers count] - 1; i >= 0; i--) {\r\n                cifra = newValue \/ pow(10, i);\r\n                if (cifra) {\r\n                        newValue = newValue - cifra * pow(10, i);\r\n                }\r\n                [self setCipher:[ciphers count] - i - 1 value:cifra];\r\n        }        \r\n}\r\n<\/pre>\n<p>Con<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nif (newValue > (pow(10, [ciphers count]) - 1)) {\r\n<\/pre>\n<p>Verifico se il valore da settare \u00e8 maggiore del pi\u00f9 grande numero rappresentabile con quel dato numero di cifre. Ricordo che [chipers count] ritorna il numero di cifre del contatore, supponiamo sia 5, allora il maggiore numero rappresentabile \u00e8 10^5 - 1 = 99999.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nif (newValue == (pow(10, [ciphers count]))) {\r\n<\/pre>\n<p>Questo secondo controllo l'ho inserito perch\u00e9 voglio ottenere un contatore che quando arriva al suo massimo valore, se incrementato di 1 si riazzera, un p\u00f2 come i contachilometri delle auto.<br \/>\nIn questo caso se il valore da settare \u00e8 proprio 100000 allora riporto a zero il contatore ed il currentvalue, viceversa scrivo un messaggio d'errore sulla console.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nint cifra;\r\n        for (int i = [ciphers count] - 1; i >= 0; i--) {\r\n                cifra = newValue \/ pow(10, i);\r\n                if (cifra) {\r\n                        newValue = newValue - cifra * pow(10, i);\r\n                }\r\n                [self setCipher:[ciphers count] - i - 1 value:cifra];\r\n        }\r\n<\/pre>\n<p>Qui c'\u00e8 un attimino di matematica, \u00e8 il primo modo che mi \u00e8 venuto in mente, magari si pu\u00f2 ottimizzare, quello che mi serve \u00e8 recuperare le singole cifre da un numero intero.<br \/>\nQuello che faccio \u00e8 questo: con un ciclo for sulla variabile i parto dalla cifra pi\u00f9 significativa e calcolo la divisione tra il nuovo valore da settare e 10^i  Se il risultato \u00e8 maggiore di zero allora sottraggo dal valore da settare il prodotto del risultato per 10^i infine imposto il valore della singola cifra con il metodo setCipher: value:<\/p>\n<p>Vediamo come al solito un esempio per chiarire meglio.<\/p>\n<p>Supponiamo di avere un contatore a 4 cifre e di voler visualizzare il valore 234.<br \/>\nLa prima iterazione del ciclo for calcoler\u00e0 234 \/ 10^3 = 0 (divisione intera, viene arrotondata) qiundi non entra nell'if e richiama direttamente il metodo per impostare a 0 la cifra in posizione 0 dell'array.<br \/>\nAlla seconda iterazione verr\u00e0 calcolato 234 \/  10^2 = 2 quindi entro nell'if e porto il nuovo valore a 234 - 200 = 34, infine imposto a 2 la cifra in posizione 1 dell'array.<br \/>\nAlla terza iterazione verr\u00e0 calcolato 34 \/ 10^1 = 3 quindi entro nell if e porto il nuovo valore a 34 - 30 = 4, ed imposto a 3 la cifra in posizione 2 dell'array.<br \/>\nAll'ultima iterazione verr\u00e0 calcolato 4 \/ 10^0 = 4 e quindi entro nell'if e porto il nuovo valore a 4 - 4 = 0, ed imposto a 4 la cifra in posizione 4 dell'array.<br \/>\nEcco che quindi nell'array ho impostato 0234, proprio il numero che volevo. Difficile? no, dai!!<br \/>\nNon ci resta che vedere il metodo che modifica il valore della singola cifra:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)setCipher:(int)acipher value:(int)value {\r\n        if (value != values[acipher]) {\r\n                NSString *str2 = [NSString stringWithFormat:@\"mc_%d.png\",value];\r\n                [[ciphers objectAtIndex:acipher] setImage:[UIImage imageNamed:str2]];        \r\n                [[ciphers objectAtIndex:acipher] startAnimating];\r\n                values[acipher] = value;\r\n        }\r\n}\r\n<\/pre>\n<p>Anche questo metodo \u00e8 piuttosto auto-esplicativo, l'unica particolarit\u00e0 \u00e8 che faccio il controllo per verificare se effettivamente il nuovo valore \u00e8 diverso dal precedente, in questo modo, quando viene incrementato il contatore non si animano tutte le cifre, ma solo quelle che effettivamente devono cambiare.<\/p>\n<p>Qui potete vedere anche il video del contatore in azione:<\/p>\n<p><center><br \/>\n<iframe loading=\"lazy\" width=\"480\" height=\"390\" src=\"http:\/\/www.youtube.com\/embed\/O9umuX5kUgI?rel=0\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>\n<\/center><\/p>\n<p>Non mi resta che lasciarvi il progetto in allegato ed attendere i vostri commenti.<br \/>\nCiao!<\/p>\n<p>IgnazioC<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/MechanicalCounter.zip\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il tutorial,\u00a0<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/MechanicalCounter.zip\" target=\"_blank\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Buongiorno a tutti! Il corso di C mi ha tenuto parecchio impegnato ed \u00e8 da un p\u00f2&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[757,756,755,759,760,758,241,242],"class_list":["post-6994","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-animazioni-xcode","tag-contatore-animato-ipad","tag-contatore-animato-iphone","tag-creare-un-contatore-xcode","tag-esempi-objective-c","tag-esempio-animazione-uiview","tag-ignazio-calo","tag-tutorial-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6994"}],"version-history":[{"count":8,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6994\/revisions"}],"predecessor-version":[{"id":7010,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6994\/revisions\/7010"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}