{"id":7928,"date":"2011-11-07T12:16:50","date_gmt":"2011-11-07T11:16:50","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=7928"},"modified":"2011-11-07T12:22:14","modified_gmt":"2011-11-07T11:22:14","slug":"uiscrollview-guida-completa-all-uso","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/uiscrollview-guida-completa-all-uso\/","title":{"rendered":"UIScrollview \u2013 Guida completa all\u2019uso"},"content":{"rendered":"<p>Le <strong>UISCrollview<\/strong> fanno parte dell&#8217;<strong>UIKit framework<\/strong> e sono utilizzate dalla stessa Apple per la realizzazione di componenti avanzati quali le <em>UIWebView<\/em> e <em>UITableView<\/em>.<\/p>\n<p>Come \u00e8 chiaro dal nome, le UISCrollView sono una subclass diretta di UIView quindi in termini di OOP possiamo dire che <strong>\u00e8<\/strong> una UIView <strong>specializzata<\/strong>.<\/p>\n<p>Ma quale sar\u00e0 mai la specializzazione di una UIScrollView? Ovviamente quella di <em>scrollare<\/em>, di rendere cio\u00e8 possibile la visualizzazione di un contenuto pi\u00f9 grande della UIScrollView stessa.<!--more--><\/p>\n<p>L&#8217;incipit della refernce (<a href=\"http:\/\/goo.gl\/tY58b\" title=\"Reference\" target=\"_blank\">link<\/a> ) dice:<\/p>\n<blockquote><p>The UIScrollView class provides support for displaying content that is larger than the size of the application\u2019s window. It enables users to scroll within that content by making swiping gestures, and to zoom in and back from portions of the content by making pinching gestures.<\/p><\/blockquote>\n<p>(La classe UISCrollview permette di visualizzare contenuti che sono pi\u00f9 grandi della dimensione della finestra dell&#8217;applicazione. Permette all&#8217;utente di scrollare il contenuto tramite swipe e zoomare tramite pinch).<\/p>\n<p>Non so perch\u00e9 Apple faccia quel riferimento all&#8217;application window, direi che si tratta di un&#8217;imprecisione, perch\u00e9 affinch\u00e9 si possa scrollare \u00e8 necessario che il contenuto sia pi\u00f9 grande della UIScrollview stessa indipendentemente dalla dimensione della uiwindow.<\/p>\n<h4>Come funzionano le UIScrollView?<\/h4>\n<p>Esamineremo il funzionamento della scrollview creando una piccola applicazione di esempio, apriamo quindi xcode e creiamo un nuovo progetto di tipo &#8220;single view application&#8221;. Io l&#8217;ho chiamato <code>devappScrollview<\/code> ed ho tolto il flag sia da &#8220;Use storyboard&#8221; e sia da &#8220;Use Automatic reference counting&#8221; (che ci posso fare, sono vecchia scuola \ud83d\ude42 )<\/p>\n<p>In questo articolo non staremo molto a guardare lo stile di programmazione, quindi andremo a creare l&#8217;interfaccia direttamente nel metodo <code>viewDidLoad<\/code> del primo UIViewController.<br \/>\nIdentifichiamo quindi questo metodo e posizioniamoci subito dopo <code>[super viewDidLoad];<\/code><\/p>\n<p>Come tutte le UIView anche la UISCrollview ha la sua propriet\u00e0 <strong>frame<\/strong> che identifica il rettangolo dove verr\u00e0 visualizzata.<\/p>\n<p>Allochiamo e inizializiamo una nuova UIScrollView con il codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nUIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 30, 300, 400)];\r\n<\/pre>\n<p>Aggiungiamola quindi alla view principale del viewcontroller e non dimentichiamo di rilasciarla:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[self.view addSubview:scroll];\r\n[scroll release];\r\n<\/pre>\n<p>Compiliamo e osserviamo il risultato&#8230;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_11-159x300.png\" alt=\"\" width=\"159\" height=\"300\" class=\"aligncenter size-medium wp-image-7933\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_11-159x300.png 159w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_11.png 198w\" sizes=\"auto, (max-width: 159px) 100vw, 159px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Sembra che non sia successo nulla, perch\u00e9 come tutte le uiview anche la scrollview di default si presenta con il colore trasparente.<\/p>\n<p>Per renderci conto di dove \u00e8 effettivamente posizionata la scrollview coloriamola di rosso inserendo questo codice subito dopo l&#8217;inizializzazione:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[scroll setBackgroundColor:[UIColor redColor]];\r\n<\/pre>\n<p>Adesso il simulatore mostra la posizione della scrollview:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_2-159x300.png\" alt=\"\" width=\"159\" height=\"300\" class=\"aligncenter size-medium wp-image-7936\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_2-159x300.png 159w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_2.png 198w\" sizes=\"auto, (max-width: 159px) 100vw, 159px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La UIScrollview abbiamo detto che fa da contenitore, quindi proviamo ad aggiungere un&#8217;immagine al suo interno e vediamo cosa succede.<\/p>\n<p>Ho scelto appositamente un&#8217;immagine con una dimensione un p\u00f2 particolare 400 x 1222, l&#8217;idea \u00e8 quella di permettere quindi di scrollare l&#8217;immagine in orizzontale per poterla visualizzare. Questa \u00e8 l&#8217;immagine utilizzata (cliccateci sopra per vedere le dimensioni effettive e per scaricarla e usarla nel vostro progetto):<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/panorama_orizzonte_medio_big.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/panorama_orizzonte_medio_big-300x98.jpg\" alt=\"\" width=\"300\" height=\"98\" class=\"aligncenter size-medium wp-image-7938\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/panorama_orizzonte_medio_big-300x98.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/panorama_orizzonte_medio_big-1024x335.jpg 1024w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/panorama_orizzonte_medio_big.jpg 1222w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Aggiungiamo quindi questa immagine al progetto xcode (file-&gt;add file to &#8220;project&#8221;) e creiamo una nuova UIImageview da inserire dentro la UIScrollview. Per chiarezza riporto tutto il metodo <code>viewdidload<\/code>:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n\tUIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 30, 300, 400)];\r\n\t[scroll setBackgroundColor:[UIColor redColor]];\r\n\t\r\n\tUIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1222, 400)];\r\n\t[imageview setImage:[UIImage imageNamed:@\"panorama_orizzonte_medio_big.jpg\"]];\r\n\t[scroll addSubview:imageview];\r\n\t[imageview release];\r\n\t\r\n\t[self.view addSubview:scroll];\r\n\t[scroll release];\r\n}\r\n<\/pre>\n<p>Il risultato \u00e8 questo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_3-159x300.png\" alt=\"\" width=\"159\" height=\"300\" class=\"aligncenter size-medium wp-image-7940\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_3-159x300.png 159w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_3.png 198w\" sizes=\"auto, (max-width: 159px) 100vw, 159px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Per\u00f2 c&#8217;\u00e8 un grosso problema&#8230;non scrolla!<\/p>\n<h4>Abilitiamo lo scroll<\/h4>\n<p>Affinch\u00e9 la UIScrollView sappia quanto e come scrollare \u00e8 necessario impostare la propriet\u00e0 <code>contentSize<\/code> di questo oggetto, facciamolo e ricompiliamo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n\tUIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 30, 300, 400)];\r\n\t[scroll setBackgroundColor:[UIColor redColor]];\r\n\t\r\n\tUIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1222, 400)];\r\n\t[imageview setImage:[UIImage imageNamed:@\"panorama_orizzonte_medio_big.jpg\"]];\r\n\t[scroll addSubview:imageview];\r\n\t[imageview release];\r\n\t\r\n\t[self.view addSubview:scroll];\r\n\t[scroll release];\r\n}\r\n<\/pre>\n<p>Anche se lo screenshot \u00e8 piccolino si riesce a vedere la barra di scorrimento orizzonale, segno che siamo riusciti nel nostro compito.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_4-159x300.png\" alt=\"\" width=\"159\" height=\"300\" class=\"aligncenter size-medium wp-image-7942\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_4-159x300.png 159w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_4.png 198w\" sizes=\"auto, (max-width: 159px) 100vw, 159px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>La gestione dello zoom<\/h4>\n<p>La gestione dello zoom \u00e8 leggermente diversa dalla logica che abbiamo visto adesso e usa il concetto di delegate. Quando l&#8217;utente fa pinch sulla UISCrollview questa invoca sul suo delegate il metodo:<br \/>\n<code>- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView<\/code> al quale il delegate risponde con una UIView.<\/p>\n<p>Ci si potrebbe chiedere come mai la scrollview semplicemente non faccia in autonomia uno zoom sulla UIView visualizzata ed il motivo \u00e8 che utilizzando il delegate si ha, ad esempio, la possibilit\u00e0 di fornire una view diversa per diversi livelli di zoom. Supponiamo di avere due versioni della foto del panorama, una a bassa risoluzione ed un&#8217;altra ad altissima risoluzione, per ovvie ragioni di memoria all&#8217;inizio carichiamo quella a bassa risoluzione, poi se l&#8217;utente inizia a fare zoom oltre un certo livello potremmo sostituire l&#8217;immagine a bassa risoluzione con una porzione dell&#8217;immagine ad alta. Un p\u00f2 come succede quando si usa una mapview o strumenti analoghi.<\/p>\n<p>Per abilitare lo zoom dobbiamo quindi modificare il viewcontroller per renderlo conforme al protocollo UIScrollViewDelegate, aggiungiamo inoltre una variabile di istanza di tipo UIImageview. Il file .h del nostro viewcontroller si presenter\u00e0 quindi in questo modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface ViewController : UIViewController &lt;UIScrollViewDelegate&gt; {\r\n\tUIImageView *imageview;\r\n}\r\n\r\n@end\r\n<\/pre>\n<p>Nel metodo viewdidload impostiamo quindi il delegate della scrollview e utilizziamo la variabile di istanza piuttosto che la variabile locale:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n\tUIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 30, 300, 400)];\r\n\t[scroll setDelegate:self];\r\n\t[scroll setBackgroundColor:[UIColor redColor]];\r\n\t\r\n\timageview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1222, 400)];\r\n\t[imageview setImage:[UIImage imageNamed:@\"panorama_orizzonte_medio_big.jpg\"]];\r\n\t[scroll addSubview:imageview];\r\n\t\r\n\t[scroll setContentSize:CGSizeMake(1222, 400)];\r\n\t[self.view addSubview:scroll];\r\n\t[scroll release];\r\n}\r\n<\/pre>\n<p>notate che ho tolto anche il release della imageview perch\u00e9 voglio che sia valida anche all&#8217;uscita di questo metodo, per\u00f2 non dobbiamo generare memory leak, quindi aggiungiamo il medo dealloc in cui rilasciamo tutto.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)dealloc {\r\n\t[imageview release];\r\n\t[super dealloc];\r\n}\r\n<\/pre>\n<p>..ok ok lo so..se avessi abilitato ARC mi sarei risparmiato un p\u00f2 di rogne \ud83d\ude09<\/p>\n<p>Aggiungiamo il metodo per la gestione dello zoom limitandoci a ritornare l&#8217;oggetto imageview:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {\r\n\treturn imageview;\r\n}\r\n<\/pre>\n<p>Se proviamo a compilare a questo punto, ci accorgiamo che lo zoom non funziona ancora&#8230; e questo ci porta ad esaminare due altre propery dell&#8217;oggetto UISCrollView: <code>maximumZoomScale<\/code> e <code>minimumZoomScale<\/code>. Se guardiamo la documentazione notiamo che per entrambe il valore di default \u00e8 1.0 il che significa che il contenuto non pu\u00f2 essere n\u00e9 zoomato n\u00e9 rimpicciolito. Impostiamo rispettivamente questi valori a 2.0 e 0.5 e ricompiliamo il progetto: finalmente siamo riusciti ad attivare anche questa funzionalit\u00e0.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_5-300x279.png\" alt=\"\" width=\"300\" height=\"279\" class=\"aligncenter size-medium wp-image-7947\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_5-300x279.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_5.png 400w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Paging con UIScrollview <\/h4>\n<p>Un utilizzo molto comune delle UISCrollview \u00e8 quello di creare browser di fotografie, visualizzabili tramite swipe.<\/p>\n<p>Se avessimo memoria infinita il compito sarebbe piuttosto semplice, basterebbe creare tante UIImageView quante sono le immagini da visualizzare, posizionarle all&#8217;interno della scrollview ed avremmo gi\u00e0 realizzato il nostro browser. Purtroppo ci tocca essere un tantino pi\u00f9 attenti e cercare di risparmiare quanta pi\u00f9 memoria possibile. Decidiamo quindi di mantenere in memoria soltanto 3 immagini, quella corrente, quella precedente e quella successiva, questo ci permetter\u00e0 di occupare una quantit\u00e0 fissa di memoria, indipendente dal numero di foto che compongono la galleria.<\/p>\n<p>Un&#8217;idea di quello che andremo a realizzare lo si vede in questa simulazione:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_6-300x186.png\" alt=\"\" width=\"300\" height=\"186\" class=\"aligncenter size-medium wp-image-7949\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_6-300x186.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/scrollview_6.png 600w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Modifichiamo il nostro progetto inserendo 3 variabili di istanza di tipo UIImageview e una variabile intera che memorizzer\u00e0 il numero della pagina corrente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@interface ViewController : UIViewController  {\r\n\tUIImageView *imageview1;\r\n\tUIImageView *imageview2;\r\n\tUIImageView *imageview3;\r\n        int currentPage;\r\n}\r\n@end\r\n<\/pre>\n<p>e non dimentichimoci del metodo dealloc:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)dealloc {\r\n\t[imageview1 release];\r\n\t[imageview2 release];\r\n\t[imageview3 release];\r\n\t[super dealloc];\r\n}\r\n<\/pre>\n<p>Dichiariamo quindi una costante globale in cui memorizziamo il numero di foto che compongono la galleria:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nconst int numImages = 5;\r\n<\/pre>\n<p>e passiamo infine a generare la scrollview sempre all&#8217;interno del metodo <code>viewdidload<\/code>.<\/p>\n<p>In questo caso il contentview della scrollview sar\u00e0 uguale alla larghezza di ogni singola immagine per il numero delle immagini che compongono la galleria.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nUIScrollView* scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 30, 400, 300)];\r\n[scroll setDelegate:self];\r\n[scroll setContentSize:CGSizeMake(300 * numImages, 400)];\r\n<\/pre>\n<p>Passiamo quindi alla generazione delle tre UIImageview, ciascuna 300px pi\u00f9 a destra della precedente e ne impostiamo la propriet\u00e0 tag cos\u00ec da poterle recuperare con un po&#8217; di matematica:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nimageview1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];\r\n[imageview1 setImage:[UIImage imageNamed:@\"tiger0.jpg\"]];\r\n[imageview1 setTag:1];\r\nimageview2 = [[UIImageView alloc] initWithFrame:CGRectMake(300, 0, 300, 400)];\r\n[imageview2 setTag:2];\r\n\r\nimageview3 = [[UIImageView alloc] initWithFrame:CGRectMake(600, 0, 300, 400)];\r\n[imageview3 setTag:3];\r\n[scroll addSubview:imageview1];\r\n[scroll addSubview:imageview2];\r\n[scroll addSubview:imageview3];\r\n<\/pre>\n<p>L&#8217;idea \u00e8 quella di spostare queste imageview durante l&#8217;operazione di scrolling cos\u00ec da simulare la presenza di un numero illimitato di imageview.<\/p>\n<p>Per fare questo aggiungiamo nel nostro viewcontroller anche il metodo<br \/>\n<code>-(void)scrollViewDidScroll:(UIScrollView*)scrollView<\/code> che viene richiamato durante la fase di scrolling.<\/p>\n<p>All&#8217;interno del metodo calcoliamo l&#8217;attuale posizione della scrollview:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nconst CGFloat currPos = scrollView.contentOffset.x;\r\n<\/pre>\n<p>da questo valore calcoliamo la pagina che \u00e8 attualmente visualizzata:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nconst NSInteger selectedPage = lroundf(currPos \/ 300.0); \r\n<\/pre>\n<p>calcoliamo infine quale delle tre imageview \u00e8 al centro dello schermo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nconst NSInteger zone = 1 + (selectedPage % 3); \r\nconst NSInteger nextPage = selectedPage + 1;\r\nconst NSInteger prevPage = selectedPage - 1;\r\n<\/pre>\n<p>Passiamo quindi a configurare l&#8217;imageView successiva, verificando di non essere arrivati alla fine della nostra galleria. Recuperiamo l&#8217;imageview attraverso la sua propriet\u00e0 tag e la spostiamo nella posizione successiva alla schermata attuale impostandone la propriet\u00e0 image:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\tif (nextPage &lt; numImages)\r\n\t{\r\n\t\tNSInteger nextViewTag = zone + 1;\r\n\t\tif (nextViewTag == 4)\r\n\t\t\tnextViewTag = 1;\r\n\t\tUIImageView* nextView = (UIImageView*)[scrollView viewWithTag:nextViewTag];\r\n\t\tnextView.frame = CGRectMake(nextPage * 300, 0, 300, 400);\r\n\t\tNSString *str = [NSString stringWithFormat:@&quot;tiger%d.jpg&quot;, nextPage];\r\n\t\tUIImage* img = [UIImage imageNamed:str];\r\n\t\tnextView.image = img;\r\n\t}\r\n<\/pre>\n<p>Lo stesso lavoro va fatto con la imageview precedente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nif (prevPage &gt;= 0)\r\n\t{\r\n\t\tNSInteger prevViewTag = zone - 1;\r\n\t\tif (!prevViewTag)\r\n\t\t\tprevViewTag = 3;\r\n\t\tUIImageView* prevView = (UIImageView*)[scrollView viewWithTag:prevViewTag];\r\n\t\tprevView.frame = (CGRect){.origin.x = prevPage * 300, .origin.y = 0.0f, .size = prevView.frame.size};\r\n\t\tNSString *str = [NSString stringWithFormat:@\"tiger%d.jpg\", prevPage];\r\n\t\tUIImage* img = [UIImage imageNamed:str];\r\n\t\tprevView.image = img;\r\n\t}\r\n<\/pre>\n<p>Eccoci al termine della nostra guida, compilate ed eseguite il programma e, se avete seguito tutto correttamente, dovreste godervi la vostra nuova galleria fotografica.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/UIScrollview-guida-all-uso-devAPP.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 progetto presentato, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/11\/UIScrollview-guida-all-uso-devAPP.zip\" target=\"_blank\">questo \u00e8 il link per scaricare l&#8217;esempio completo.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le UISCrollview fanno parte dell&#8217;UIKit framework e sono utilizzate dalla stessa Apple per la realizzazione di componenti&#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":[42],"tags":[965,961,269,962,963,271,964],"class_list":["post-7928","post","type-post","status-publish","format-standard","hentry","category-framework","tag-photogallery-xcode","tag-uikit-framework","tag-uiscrollview","tag-uiscrollview-paging","tag-uiscrollview-scroll-and-zoom","tag-uiscrollviewdelegate","tag-viewforzoominginscrollview"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7928","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=7928"}],"version-history":[{"count":30,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7928\/revisions"}],"predecessor-version":[{"id":7967,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7928\/revisions\/7967"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=7928"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=7928"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=7928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}