{"id":3839,"date":"2010-06-30T14:58:28","date_gmt":"2010-06-30T12:58:28","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3839"},"modified":"2010-07-01T10:11:10","modified_gmt":"2010-07-01T08:11:10","slug":"t059-creiamo-unapplicazione-per-iphone-in-stile-brushes","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t059-creiamo-unapplicazione-per-iphone-in-stile-brushes\/","title":{"rendered":"T#059 &#8211; Creiamo un&#8217;applicazione per iPhone in stile &#8220;Brushes&#8221; [Parte 1]"},"content":{"rendered":"<p>Quello che ho pensato per voi questa volta \u00e8 un po&#8217; particolare, ma secondo me molto carino e con molte cose utili all&#8217;interno da imparare. Sicuramente tutti voi conoscerete\u00a0<strong>Brushes<\/strong> (<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/brushes\/id288230264?mt=8&#038;partnerId=2003\" target=\"_blank\">link iTunes<\/a>), un programma molto famoso per disegnare sul proprio iPhone e iPod Touch con le dita.<\/p>\n<p>Ho pensato, quindi, di spiegarvi come realizzarne uno tutto vostro! In questa prima parte vedremo come fare in modo che l&#8217;utente possa, muovendo il dito sullo schermo, disegnare a suo piacimento.<\/p>\n<p>Ovviamente in questa prima parte ci occuperemo solo di questo aspetto. Nel prossimo tutorial, invece, vedremo come rendere possibile la definizione di un pennello personale, con dimensione e colore a scelta.<!--more--><\/p>\n<p>Ora, per\u00f2, concentriamoci sulla prima parte. Buon tutorial a tutti!<\/p>\n<h4>1. Creiamo un nuovo progetto<\/h4>\n<p>Iniziamo creando il progetto per la nostra applicazione. Create un nuovo progetto edi tipo &#8220;Utility Application&#8221; e inserite &#8220;SampleBrushes&#8221; come nome.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3840\" title=\"Immagine 1\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-1-300x249.jpg\" alt=\"\" width=\"300\" height=\"249\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-1-300x249.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-1.jpg 813w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>La struttura che abbiamo selezionato ci mette a disposizione due viste: una &#8220;Main View&#8221; che \u00e8 quella che appare inizialmente, e una &#8220;Flipside View&#8221;, che appare se viene premuto il pulsante &#8220;i&#8221; (info), con un&#8217;animazione gi\u00e0 definita. Queste due viste, quindi, potremo sfruttarle per creare la nostra applicazione: nella &#8220;Main View&#8221; creeremo la zona in cui l&#8217;utente potr\u00e0 disegnare, mentre nella &#8220;Flipside View&#8221; inseriremo le impostazioni (quindi il colore del pennello, la dimensione, etc).<\/p>\n<p>Prima di definire l&#8217;aspetto grafico della nostra applicazione, definiamo un componente che poi andremo a collegare con un elemento in Interface Builder.<\/p>\n<p>Aprite, quindi, il file &#8220;MainViewController.h&#8221; (nella sottocartella &#8220;Main View) e inserite le seguenti definizioni:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"FlipsideViewController.h\"\r\n\r\n@interface MainViewController : UIViewController &lt;FlipsideViewControllerDelegate&gt; {\r\n IBOutlet UIImageView *viewDisegno;\r\n\r\n}\r\n\r\n- (IBAction)showInfo;\r\n- (IBAction)cancella;\r\n\r\n@end\r\n<\/pre>\n<p>Alla riga 4 abbiamo definito un oggetto di tipo UIImageView, che sar\u00e0 l&#8217;oggetto in cui l&#8217;utente disegner\u00e0, e che visualizzer\u00e0, quindi, una serie di componenti grafiche colorate. Alla riga 10, invece, abbiamo definito un&#8217;azione, che ci servir\u00e0 per cancellare tutto ci\u00f2 che l&#8217;utente ha disegnato.<\/p>\n<h4>2. Definiamo l&#8217;aspetto grafico dell&#8217;applicazione<\/h4>\n<p>Salviamo il file e apriamo &#8220;MainView.xib&#8221;. Ci ritroveremo con una vista come questa:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-21.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3841\" title=\"Immagine 2\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-21-206x299.png\" alt=\"\" width=\"206\" height=\"299\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-21-206x299.png 206w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-21-103x149.png 103w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-21.png 400w\" sizes=\"auto, (max-width: 206px) 100vw, 206px\" \/><\/a><\/p>\n<p>Dobbiamo modificarne un po&#8217; l&#8217;aspetto. Iniziamo scegliendo come colore di sfondo il bianco (lo fate semplicemente dal pannello Attributes Inspector). Cancellate, inoltre, il bottone &#8220;i&#8221; che \u00e8 presente nell&#8217;angolo basso destro della vista.<br \/>\nInserite, quindi, un componente di tipo &#8220;UIImageView&#8221;, in modo che occupi tutta la vista:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-31.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3842\" title=\"Immagine 3\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-31-206x299.png\" alt=\"\" width=\"206\" height=\"299\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-31-206x299.png 206w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-31-103x149.png 103w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-31.png 400w\" sizes=\"auto, (max-width: 206px) 100vw, 206px\" \/><\/a><\/p>\n<p>Aggiungete, poi, una UIToolbar sul fondo della vista stessa. Io ho messo come stile della toolbar &#8220;Black Translucent&#8221;, ovviamente voi potete farla come preferite. Inserite, inoltre, due bottoni &#8220;Bar Button Item&#8221;, e un &#8220;Flexible Space Bar Button Item&#8221; tra i due. Il primo bottone rinominatelo in &#8220;Cancella&#8221; mentre il secondo in &#8220;Settings&#8221; (Impostazioni \u00e8 troppo lunga come dicitura xD). Ecco l&#8217;aspetto finale della mia applicazione:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-41.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3843\" title=\"Immagine 4\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-41-206x299.png\" alt=\"\" width=\"206\" height=\"299\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-41-206x299.png 206w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-41-103x149.png 103w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-41.png 400w\" sizes=\"auto, (max-width: 206px) 100vw, 206px\" \/><\/a><\/p>\n<p>Ovviamente sarebbe pi\u00f9 carino inserire delle immagini nei bottoni, ma per semplicit\u00e0 ho inserito dei semplici nomi.<\/p>\n<p>Colleghiamo, ora, l&#8217;elemento e le azioni che abbiamo definito poco fa via codice (l&#8217;azione &#8220;showInfo&#8221; era gi\u00e0 presente di default). Dal pannello dei documenti selezioniamo &#8220;File&#8217;s Owner&#8221; e spostiamoci in &#8220;Connections Inspector&#8221;. Colleghiamo &#8220;viewDisegno&#8221; con la UIImageView che abbiamo inserito, l&#8217;azione &#8220;cancella&#8221; colleghiamola con l&#8217;omonimo pulsante, mentre &#8220;showInfo&#8221; collegatela con il bottone &#8220;Settings&#8221;. Se avrete eseguito tutto correttamente avrete un pannello delle connesioni come questo:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-51.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3844\" title=\"Immagine 5\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-51.png\" alt=\"\" width=\"301\" height=\"245\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-51.png 301w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-51-300x244.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-51-150x122.png 150w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/a><\/p>\n<p>Abbiamo concluso questa fase. Possiamo salvare il tutto e chiudere Interface Builder.<\/p>\n<h4>3. Definiamo i metodi necessari<\/h4>\n<p>Torniamo ora al file &#8220;MainViewController.h&#8221;. Dobbiamo definire degli elementi che ci serviranno nel nostro programma. Ecco il codice da aggiungere a quello gi\u00e0 presente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"FlipsideViewController.h\"\r\n\r\n@interface MainViewController : UIViewController &lt;FlipsideViewControllerDelegate&gt; {\r\n IBOutlet UIImageView *viewDisegno;\r\n\r\n CGPoint ultimoPunto;\r\n\r\n float dimensionePennello;\r\n UIColor *colorePennello;\r\n}\r\n\r\n- (IBAction)showInfo;\r\n- (IBAction)cancella;\r\n\r\n@end\r\n<\/pre>\n<p>Analizziamo gli elementi che abbiamo appena inserito. Alla riga 6 abbiamo definito un oggetto CGPoint, che non \u00e8 altro che un contenitore delle deu componenti di un punto: le coordinate x e y. Questo ci servir\u00e0 per sapere il punto precedente a quello considerato, permettendoci cos\u00ec di tracciare una linea. Alla riga 9 e 10 definiamo le caratteristiche del pennello: dimensione e colore. La dimensione \u00e8 una variabile di tipo reale (float), mentre il colore \u00e8 definito dal tipo UIColor, che inizializzeremo con lo standard RGB.<\/p>\n<p>Queste sono le uniche dichiarazioni di cui abbiamo bisogno. Salviamo quindi questo file e spostiamoci in &#8220;MainViewController.m&#8221;.<\/p>\n<p>Le azioni che ci interessa definire saranno da implementare in 3 metodi tipici della gestione del multitouch:<\/p>\n<ul>\n<li><em>touchesBegan<\/em>, richiamato quando si inizia un movimento. Dovremo ricavare il punto in cui deve iniziare il disegno;<\/li>\n<li><em>touchesMoved<\/em>, richiamato quando un movimento \u00e8 in corso. Ogni volta che viene avviato deve disegnare un segmento colorato, in modo che appaia una linea raffigurante il disegno dell&#8217;utente;<\/li>\n<li><em>touchesEnded<\/em>, metodo richiamato quando il movimento \u00e8 terminato. In particolare serve quando l&#8217;utente compie solo un singolo tap, disegnando cos\u00ec un semplice punto.<\/li>\n<\/ul>\n<p>Iniziamo, quindi, a scrivere il codice necessario. Iniziamo con il metodo &#8220;viewDidLoad&#8221;:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad {\r\n [super viewDidLoad];\r\n\r\n dimensionePennello = 5.0;\r\n colorePennello = [[UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0] retain];\r\n}\r\n<\/pre>\n<p>Il suo compito \u00e8 molto semplic e chiaro: viene impostata una dimensione standard del pennello, a 5.0 (pixel) e un colore, in questo caso il rosso. La definizione del colore avviene settando le componenti RGB, ovvero Red (rosso), Green (verde) e Blue (blu): variando le quantit\u00e0 con un valore compreso da 0.0 a 1.0 otterremo tutti i colori ammessi da questo sistema. Il campo alpha, invece, rappresenta la trasparenza. Fate qualche prova per prendere confidenza con questo sistema!<\/p>\n<p>Il secondo metodo che andiamo a definire \u00e8 &#8220;touchesBegan&#8221;. La sua implementazione \u00e8 molto semplice, dobbiamo solo ricavare il punto di inizio del movimento. Ecco il metodo da inserire:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {\r\n\r\n UITouch *touch = [touches anyObject];\r\n ultimoPunto = [touch locationInView:viewDisegno];\r\n}\r\n<\/pre>\n<p>Come vedete \u00e8 molto semplice: dall&#8217;oggetto touch si ricava il punto (sempre definito come CGPoint), che viene assegnato all&#8217;oggetto &#8220;ultimoPunto&#8221; (riga 4). \u00c8 importante specificare &#8220;viewDisegno&#8221; come parametro della funzione &#8220;locationInView&#8221;, altrimenti ricaverete tocchi relativi anche ad altre parti dello schermo, che per\u00f2 a noi non interessano.<\/p>\n<p>Passiamo ora alla definizione del metodo pi\u00f9 impegnativo e importante: &#8220;touchesMoved&#8221;. Ecco il metodo da inserire:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {\r\n\r\n UITouch *touch = [touches anyObject];\r\n CGPoint puntoCorrente = [touch locationInView:viewDisegno];\r\n\r\n \/\/ definiamo il contest grafico\r\n UIGraphicsBeginImageContext(viewDisegno.frame.size);\r\n [viewDisegno.image drawInRect:CGRectMake(0, 0, viewDisegno.frame.size.width, viewDisegno.frame.size.height)];\r\n \/\/ settiamo la forma e la dimensione del pennello\r\n CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);\r\n CGContextSetLineWidth(UIGraphicsGetCurrentContext(), dimensionePennello);\r\n \/\/ convertiamo il colore e impostiamolo come colore del pennello\r\n const CGFloat *components = CGColorGetComponents([colorePennello CGColor]);\r\n CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), components[0], components[1], components[2], components[3]);\r\n \/\/ disegna il percorso\r\n CGContextBeginPath(UIGraphicsGetCurrentContext());\r\n CGContextMoveToPoint(UIGraphicsGetCurrentContext(), ultimoPunto.x, ultimoPunto.y);\r\n CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), puntoCorrente.x, puntoCorrente.y);\r\n CGContextStrokePath(UIGraphicsGetCurrentContext());\r\n \/\/ settiamo il disegno appena creato\r\n viewDisegno.image = UIGraphicsGetImageFromCurrentImageContext();\r\n UIGraphicsEndImageContext();\r\n\r\n ultimoPunto = puntoCorrente;\r\n}\r\n<\/pre>\n<p>Iniziamo ad analizzare passo passo il codice che abbiao appena scritto.<\/p>\n<p>Alla riga 7 troviamo la definizione di un &#8220;Graphics Contexts&#8221;. Questo \u00e8 un aspetto complesso del Core Graphics, ma utilizzando questa funzione lo adattiamo semplicemente alla nostra UIImageView, che infatti gli passiamo come parametro. Questo ci permetter\u00e0 di disegnare all&#8217;interno della nostra immagine. Con l&#8217;istruzione seguente, infatti, definiamo l&#8217;area in cui potremo disegnare: essa avr\u00e0 la stessa dimensione dell&#8217;immagine &#8220;viewDisegno&#8221;.<\/p>\n<p>Le righe 10 e 11 si riferiscono alla definizione del &#8220;pennello&#8221;, con cui l&#8217;utente disegner\u00e0 sullo schermo. Prima, infatti, viene impostata la forma (in questo caso &#8220;kCGLineCapRound&#8221; \u00e8 di forma circolare, ma possiamo anche farlo quadrato o triangolare, vi basta guardare la documentazione per vedere gli altri valori possibili), poi la dimensione, passando ovviamente la variabile &#8220;dimensionePennello&#8221;, che contiene proprio il valore desiderato (riga 11).<\/p>\n<p>Le righe 13 e 14 servono per impostare il colore al nostro pennello. Abbiamo visto prima che il colore \u00e8 definito da un elemento UIColor. Purtroppo dobbiamo convertire le varie componenti in CGFloat, e l&#8217;unico modo che ho trovato \u00e8 quello che vedete nel codice. Prima convertiamo l&#8217;elemento &#8220;colorePennello&#8221; in un array di tipo CGFloat (riga 13), poi passiamo le varie componenti all&#8217;istruzione che setta il colore del pennello (riga 14).<\/p>\n<p>Le righe dalla 16 alla 19 sono quelle che si occupano del disegno vero e proprio della linea. Partendo da &#8220;ultimoPunto&#8221; fino a &#8220;puntoCorrente&#8221; viene disegnato un tratto, un disegno, che comporr\u00e0 poi il tratto voluto dall&#8217;utente.<\/p>\n<p>Le righe 21 e 22 settano il disegno che \u00e8 stato creato nell&#8217;immagine &#8220;viewDisegno&#8221;, rendendola cos\u00ec visibile all&#8217;utente.<\/p>\n<p>Come vedete non \u00e8 poi cos\u00ec complicato il codice, per\u00f2 bisogna fare attenzione a non dimenticare niente.<\/p>\n<p>Manca poco per terminare il nostro programma! Dobbiamo definire il metodo &#8220;touchesEnded&#8221;. Esso dovr\u00e0 esattamente fare le stesse cose che fa il metodo &#8220;touchesMoved&#8221;. Potremmo anche non implementare questo metodo, per\u00f2 in caso di singolo tap non succederebbe niente, mentre noi vogliamo disegnare un singolo punto. Ovviamente potete personalizzare questo aspetto, decidendo voi l&#8217;azione da compiere. Ecco il codice da inserire se volete che ad un singolo tap venga disegnato un punto:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {\r\n\r\n [self touchesMoved:touches withEvent:event];\r\n}\r\n<\/pre>\n<p>Come vedete non facciamo altro che richiamare il metodo &#8220;touchesMoved&#8221;, davvero semplicissimo.<\/p>\n<p>L&#8217;ultima cosa da fare \u00e8 l&#8217;implementazione del metodo &#8220;cancella&#8221;. Anche questo \u00e8 davvero molto semplice, per cancellare tutto ci\u00f2 che l&#8217;utente ha disegnato basta porre a &#8220;nil&#8221; l&#8217;immagine:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (IBAction)cancella{\r\n viewDisegno.image = nil;\r\n}\r\n<\/pre>\n<p>Davvero semplice!<\/p>\n<p>Abbiamo concluso questa prima parte del nostro tutorial! Clicchiamo &#8220;Build and Run&#8221; e testiamo il nostro personalissimo Brushes!<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-61.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3845\" title=\"Immagine 6\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-61.png\" alt=\"\" width=\"414\" height=\"770\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-61.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-61-161x300.png 161w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/Immagine-61-80x150.png 80w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/SampleBrushes_parte1.zip\"><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\/2010\/06\/SampleBrushes_parte1.zip\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n<p style=\"text-align: center;\">\n<p style=\"text-align: left;\">Nella prossima parte del tutorial vedremo come aggiungere delle impostazioni, da cui potremo modificare il colore del pennello e la sua dimensione. Alla prossima puntata!<\/p>\n<p style=\"text-align: left;\"><em>La guida \u00e8 stata creata da Andrea Busi per &#8220;devAPP&#8221;, partendo dalla guida &#8220;<a href=\"http:\/\/www.ipodtouchfans.com\/forums\/showthread.php?t=132024\" target=\"_blank\">Drawing to the screen<\/a>&#8221; del forum di &#8220;iPod Touch Fans&#8221;. I meriti, quindi, sono dei legittimi autori.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quello che ho pensato per voi questa volta \u00e8 un po&#8217; particolare, ma secondo me molto carino&#8230;<\/p>\n","protected":false},"author":254,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[216,293,262,261,204],"class_list":["post-3839","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-andrea-busi","tag-touchesbegan","tag-touchesended","tag-touchesmoved","tag-uicolor"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3839","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\/254"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3839"}],"version-history":[{"count":8,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3839\/revisions"}],"predecessor-version":[{"id":3866,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3839\/revisions\/3866"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3839"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3839"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}