{"id":4704,"date":"2010-10-20T13:25:10","date_gmt":"2010-10-20T11:25:10","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=4704"},"modified":"2010-10-21T12:28:53","modified_gmt":"2010-10-21T10:28:53","slug":"t077-sfruttiamo-magnetometro-e-coregraphics-nelle-nostre-applicazioni-iphone","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t077-sfruttiamo-magnetometro-e-coregraphics-nelle-nostre-applicazioni-iphone\/","title":{"rendered":"T#077 &#8211; Sfruttiamo Magnetometro e CoreGraphics nelle nostre applicazioni iPhone"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-00.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-4718\" title=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-00\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-00.png\" alt=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-00\" width=\"80\" height=\"80\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-00.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-00-92x92.png 92w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-00-64x64.png 64w\" sizes=\"auto, (max-width: 80px) 100vw, 80px\" \/><\/a> Con questo tutorial voglio spiegare come ruotare dinamicamente un&#8217;immagine sfruttando un metodo presente in QuartzCore. Per tale dinamismo sfrutteremo inoltre il magnetometro, che ci permetter\u00e0 di ruotare l&#8217;immagine nella direzione di marcia del nostro dispositivo (useremo per questo fine una figura a forma di freccia).<!--more--><\/p>\n<h4>Partiamo con il nostro progetto<\/h4>\n<p>Apriamo Xcode e creiamo un nuovo progetto. Dall&#8217;elenco dei template disponibili selezioniamo &#8220;View-Based Application&#8221;. Proseguiamo e chiamiamo il nostro programmino &#8220;Rotation&#8221;.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-01.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4715\" title=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-01\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-01.jpg\" alt=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-01\" width=\"450\" height=\"366\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-01.jpg 450w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-01-300x244.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-01-150x122.jpg 150w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Aggiungiamo quindi un&#8217;immagine che rappresenti una freccia nel nostro progetto, se non ne avete una potete cercarla su google o eventualmente usare quella che abbiamo usato noi nel nostro esempio (che trovare riportata qui sotto). Includiamola quindi nel nostro progetto semplicemente trascinandola e facendo attenzione a spuntare &#8220;Copy items into destination group&#8217;s folder (if needed)&#8221;, che effettuer\u00e0 di fatto una copia e non un semplice link a tale file.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/arrow.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4709\" title=\"arrow\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/arrow.png\" alt=\"\" width=\"128\" height=\"128\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/arrow.png 128w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/arrow-92x92.png 92w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/arrow-64x64.png 64w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Aggiungiamo i framework necessari<\/h4>\n<p>Facciamo tasto destro sulla cartella Frameworks -> Add -> Existing Frameworks e selezioniamo &#8220;<em>QuartzCore<\/em>&#8221; e &#8220;<em>CoreLocation<\/em>&#8221;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-02.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4716\" title=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-02\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-02.jpg\" alt=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-02\" width=\"450\" height=\"295\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-02.jpg 450w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-02-300x196.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-02-150x98.jpg 150w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-03.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4733\" title=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-03\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-03.jpg\" alt=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-03\" width=\"450\" height=\"576\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-03.jpg 450w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-03-234x300.jpg 234w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-03-117x150.jpg 117w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Apriamo quindi il nostro header &#8220;rotationViewController.h&#8221; e aggiungiamo le seguenti righe di codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <CoreLocation\/CoreLocation.h>\r\n<\/pre>\n<h4>Dichiariamo variabili di istanza e metodi<\/h4>\n<p>Sempre in questo file (rotationViewController.h) dobbiamo definire il protocollo di accesso al Magnetometro, che possiamo fare in questo modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@interface rotationViewController : UIViewController <CLLocationManagerDelegate>  {\r\n<\/pre>\n<p>Aggiungiamo quindi questi due oggetti e le relative property:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\t\r\nCLLocationManager\t*locManager;\r\nUIImageView\t\t*imageRotation;\r\nUILabel\t\t\t*courseValue;\r\n}\r\n\r\n@property (assign, nonatomic) CLLocationManager *locManager;\r\n@property (retain, nonatomic) IBOutlet UIImageView *imageRotation;\r\n@property (retain, nonatomic) IBOutlet UILabel *courseValue;\r\n<\/pre>\n<p>&#8220;locManager&#8221; sar\u00e0 l&#8217;oggetto che istanzieremo per accedere al GPS (nel nostro caso specifico il magnetometro), &#8220;imageRotation&#8221; \u00e8 una semplice <em>ImageView<\/em> che conterr\u00e0 la nostra immagine da ruotare dinamicamente, &#8220;courseValue&#8221; \u00e8 una <em>UILabel<\/em> che conterr\u00e0 il valore numerico graficato dalla nostra immagine.<\/p>\n<h4>Implementiamo il codice<\/h4>\n<p>Ok, ora possiamo spostarci sul nostro file di implementazione per scrivere il codice necessario all&#8217;accesso al magnetometro e alla successiva rotazione dell&#8217;immagine.<\/p>\n<p>Usiamo la direttiva  <em>@syntesize<\/em> per poter avere a disposizione i <em>setter<\/em>\/<em>getter<\/em> delle variabili\/oggetti definiti nell&#8217;header:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@synthesize locManager;\r\n@synthesize imageRotation;\r\n@synthesize courseValue;\r\n<\/pre>\n<p>Aggiungiamo quindi nel metodo &#8220;viewDidLoad&#8221; il seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[imageRotation setImage:[UIImage imageNamed:@\"arrow.png\"]];\r\nself.locManager = [[CLLocationManager alloc] init];\r\nlocManager.delegate = self;\r\n[locManager startUpdatingHeading];\r\n<\/pre>\n<p>Con la prima istruzione assegner\u00f2 ad &#8220;imageRotation&#8221; (al momento del caricamento della vista) l&#8217;immagine precedentemente importata nel progetto, nel nostro caso l&#8217;immagine si chiama arrow.png.<br \/>\nLe tre righe successive istanziano l&#8217;oggetto &#8220;CLLocationManager&#8221; necessario per accedere alle propriet\u00e0 del GPS\/Magnetometro e deleghiamo se stesso come &#8220;ricevente&#8221; di tutti i messaggi generati da &#8220;LLocationManager&#8221;. Facciamo partire infine gli aggiornamenti generati dal magnetometro.<br \/>\nNel nostro caso specifico andremo a leggere la sua propriet\u00e0 &#8220;<em>trueHeading<\/em>&#8220;, un valore numerico che va da 0 a 359, che possiamo sommariamente considerare come:<\/p>\n<ul>\n<li>valori tra  0 e 44 = Nord<\/li>\n<li>valori tra  45 e 89 = NordEst<\/li>\n<li>valori tra  90 e 134 = Est<\/li>\n<li>valori tra  135 and 179 = SudEst<\/li>\n<li>valori tra  180 and 234 = Sud<\/li>\n<li>valori tra  235 and 269 = SudOvest<\/li>\n<li>valori tra  270 and 314 = ovest<\/li>\n<li>valori tra  315 and 359 = NordOvest<\/li>\n<\/ul>\n<p>Andiamo a scrivere ora il metodo che &#8220;CLLocationManager&#8221; ci mette a disposizione per acquisire tale valore.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#pragma mark -\r\n#pragma mark locManager Methods\r\n\r\n - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading\r\n{\r\n\t\/\/acquisico il valore numerico indicante la mia \"direzione\"\r\n\tNSString *headValue = [[NSString alloc] initWithFormat:@\"%3.0f\", newHeading.trueHeading];\r\n\t\/\/lo converto in intero\r\n\tint myIntHead = [headValue intValue];\r\n\t\/\/lo faccio processare al metodo messo a disposizione da quartz facendo ruotare l'immagine\r\n\t\/\/in base al radiante\r\n\t[imageRotation setTransform:CGAffineTransformMakeRotation(myIntHead * 3.14159\/180)];\r\n        courseValue.text = headValue;\r\n\t[headValue release];\r\n}\r\n<\/pre>\n<p>&#8220;headValue&#8221; acquisir\u00e0 un valore float composto da tre numeri interi restituito dalla propriet\u00e0 &#8220;trueHeading&#8221; del Magnetometro. Con [headValute intValue] convertiremo il valore di headValue in intero.<br \/>\nLa terza riga \u00e8 quella che si occupa di rotare l&#8217;immagine e vuole come argomento un radiante. Tale radiante lo otteniamo semplicemente moltiplicando il valore di &#8220;trueHeading&#8221; per \u03c0\/2.<\/p>\n<p>Nella quarta riga printiamo sul display il valore che stiamo graficando tramite la freccia.<\/p>\n<h4>Gestiamo la memoria<\/h4>\n<p>Come buona norma per la gestione della memoria rilasciamo tutto quello che abbiamo allocato:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidUnload {\r\n\t[locManager stopUpdatingHeading];\r\n\tself.locManager = nil;\r\n\tself.imageRotation = nil;\r\n}\r\n- (void)dealloc {\r\n    [super dealloc];\r\n\t[locManager release];\r\n\t[imageRotation release];\r\n}\r\n<\/pre>\n<h4>Disegnamo la semplice interfaccia grafica della nostra applicazione<\/h4>\n<p>Salviamo il lavoro svolto fino ad ora ed apriamo il file &#8220;rotationViewController.xib&#8221; in InterfaceBuilder (tramite semplice doppio-clik sullo stesso).<\/p>\n<p>Qui dentro dobbiamo aggiungere una ImageView e due Label, una contenente un identificativo ed una connessa ad courseValue.<br \/>\nRidimensioniamola e colleghiamola a &#8220;imageRotation&#8221; che abbiamo definito precedentemente all&#8217;interno del nostro codice.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-04.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-04.jpg\" alt=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-04\" title=\"t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-04\" width=\"450\" height=\"246\" class=\"aligncenter size-full wp-image-4762\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-04.jpg 450w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-04-300x164.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/t077-Sfruttiamo-Magnetometro-QuartzCore-applicazioni-iPhone-04-150x82.jpg 150w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Salviamo e proviamo finalmente il nostro progetto.<\/p>\n<p><strong>ATTENZIONE:<\/strong> occorrer\u00e0 provare direttamente su un device, altrimenti non noteremo alcuna differenza.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/rotation.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, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/rotation.zip\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/itunes.apple.com\/it\/app\/high-altimeter-and-stuff\/id368770019?mt=8\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4737\" title=\"banner-High-GPS-Tracker\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/banner-High-GPS-Tracker.jpg\" alt=\"\" width=\"468\" height=\"54\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/banner-High-GPS-Tracker.jpg 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/banner-High-GPS-Tracker-300x34.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/banner-High-GPS-Tracker-150x17.jpg 150w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Con questo tutorial voglio spiegare come ruotare dinamicamente un&#8217;immagine sfruttando un metodo presente in QuartzCore. Per tale&#8230;<\/p>\n","protected":false},"author":485,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[90,441,442,440,438,439],"class_list":["post-4704","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-animazioni","tag-bussola-iphone-sdk","tag-coregraphics","tag-corelocation","tag-magnetometro","tag-quartzcore"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4704","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\/485"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=4704"}],"version-history":[{"count":28,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4704\/revisions"}],"predecessor-version":[{"id":4763,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4704\/revisions\/4763"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=4704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=4704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=4704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}