{"id":7302,"date":"2011-07-26T16:14:41","date_gmt":"2011-07-26T14:14:41","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=7302"},"modified":"2011-07-26T16:14:41","modified_gmt":"2011-07-26T14:14:41","slug":"4-objective-c-uiwindow-ed-uiview","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/4-objective-c-uiwindow-ed-uiview\/","title":{"rendered":"4. Objective-C: UIWindow ed UIView"},"content":{"rendered":"<p>L&#8217;elemento base della user interface e&#8217; l&#8217;oggetto UIWindow. Esso fornisce il supporto per mostrare informazioni ed oggetti all&#8217;interno delle nostre applicazioni. UIWindow agisce come una cornice in cui e&#8217; possibile inserire contenuti. Sebbene sia l&#8217;oggetto principale su cui basarsi per la costruzione di un&#8217;interfaccia grafica, non contiene caratteristiche visuali: e&#8217; semplicemente un contenitore trasparente che fornisce il punto di contatto a piu&#8217; basso livello tra la nostra applicazione e lo schermo iPhone. Tipicamente verra&#8217; creato solo un oggetto UIWindow all&#8217;interno delle nostre applicazioni; al suo interno potranno essere aggiunti oggetti &#8211; derivanti, principalmente, dalla classe UIView &#8211; necessari alla corretta visualizzazione della nostra applicazione a schermo.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.iphonesmartapps.org\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg\" alt=\"banner-iphoneSmartApps-org\" title=\"banner-iphoneSmartApps-org\" width=\"468\" height=\"54\" class=\"aligncenter size-full wp-image-6174\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-300x34.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-150x17.jpg 150w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><!--more--><\/p>\n<p>La classe UIView e&#8217; una classe base pensata per realizzare la visualizzazione di oggetti all&#8217;interno della window. Se la UIWindow e&#8217; stata definita come una cornice, allora la classe UIView potrebbe essere pensata come una tela su cui disegnare. Esistono numerose classi derivate da UIView, utili a creare oggetti visuali, che renderizzano a schermo testo, etichette, immagini e tabelle. La classe base contiene un livello generico di funzionalita&#8217; che fornisce logiche di controllo base, metodi di disegno a schermo e risponditori ad eventi. E&#8217; possibile utilizzare la classe UIView per creare i propri oggetti e\/o per aggiungere al suo interno altri componenti del framework UIKit.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-01.jpg\" alt=\"Objective-C-UIWindow-UIView-01\" title=\"Objective-C-UIWindow-UIView-01\" width=\"550\" height=\"473\" class=\"aligncenter size-full wp-image-7309\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-01.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-01-300x258.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-01-150x129.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Nella figura sopra e&#8217; rappresentata la decomposizione per oggetti dell&#8217;applicazione Clock. Window e&#8217; l&#8217;oggetto base su cui vengono aggiunti gli ulteriori oggetti, necessari al completamento dell&#8217;applicazione: UINavigationBar, UITabBar, UIView.<\/p>\n<p>Idealmente, potremmo sintetizzare quanto disegnato sopra con del codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[myContainerView addSubview: myNavigationBar];\r\n[myContainerView addSubview: myTabBar];\r\n[myContainerView addSubview: myCustomView];\r\n[myWindow addSubview: myContainerView];\r\n<\/pre>\n<p>Ovviamente, le cose non sono proprio cosi&#8217; semplici, ma l&#8217;esempio sopra aiuta a capire come annidare gli oggetti tra loro.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-02.jpg\" alt=\"Objective-C-UIWindow-UIView-02\" title=\"Objective-C-UIWindow-UIView-02\" width=\"398\" height=\"124\" class=\"aligncenter size-full wp-image-7310\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-02.jpg 398w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-02-300x93.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-02-150x46.jpg 150w\" sizes=\"auto, (max-width: 398px) 100vw, 398px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Crezione di una finestra ed una vista<\/h4>\n<p>Prima di potere mostrare qualcosa sullo schermo del nostro iPhone, dobbiamo creare una window che ospitera&#8217; tutti i contenuti. Per costruire una finestra e&#8217; necessario un frame. Un frame e&#8217; un&#8217;area rettangolare dello schermo dove mostreremo i nostri contenuti. La struttura che contiene queste informazioni si chiama CGRect. Una struttura CGRect contiene due elementi: le coordinate per l&#8217;angolo piu&#8217; in alto a sinistra della window (origin) e la larghezza ed altezza del frame (size).<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nstruct CGRect {\r\nCGPoint origin;\r\nCGSize size;\r\n};\r\ntypedef struct CGRect CGRect;\r\n<\/pre>\n<p>Ogni oggetto che puo&#8217; essere mostrato a schermo ha un frame che definisce la sua area visibile. Quest&#8217;ultima, puo&#8217; essere impostata automaticamente per alcuni oggetti di alto livello ma, tipicamente, useremo il metodo di inizializzazione denominato initWithFrame. Quando creiamo la finestra principale, creiamo un frame le cui coordinate sono riferite allo schermo stesso. Tutti gli oggetti seguenti, invece, saranno riferiti al proprio oggetto padre.<\/p>\n<p>Ad esempio, il frame di una view aggiunta alla window principale, sara&#8217; riferito alle coordinate della window e non allo schermo. Gli oggetti aggiunti alla view, saranno riferiti alle coordinate della view e cosi&#8217; via.<\/p>\n<p>Tipicamente, un&#8217;applicazione utilizza tutto lo schermo disponibile. Per assegnare alla nostra window principale il frame corretto esistono due metodi.<\/p>\n<p>Il metodo bounds, ritorna gli estremi dello schermo, incluso lo spazio usato dalla status bar:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nCGRect screenBounds = [ [ UIScreen mainScreen ] bounds ];\r\n<\/pre>\n<p>Il metodo applicationFrame, ritorna la porzione di schermo visibile, escluso lo spazio usato dalla status bar:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nCGRect screenBounds = [ [ UIScreen mainScreen ] applicationFrame ];\r\n<\/pre>\n<p>In entrambi i casi, la struttura ritornata viene utilizzata per inizializzare correttamente il nostro oggetto UIWindow:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nwindow = [ [ UIWindow alloc ] initWithFrame: screenBounds ];\r\n<\/pre>\n<p>Abbiamo appena creato la nostra window principale. Essa, pero&#8217;, non contiene nulla di utile ai fini di visualizzazione a schermo: e&#8217; semplicemente un oggetto invisibile. E&#8217; necessario creare un oggetto che possa mostrare contenuti su quanto sopra creato. Abbiamo bisogno, quindi, di un oggetto basato sulla classe UIView.<\/p>\n<p>Come detto sopra, il posizionamento dell&#8217;oggetto window e&#8217; relativo allo schermo, mentre quello del nostro oggetto view, sara&#8217; relativo alla window. Se la window inizia sotto la status bar (0, 20), la view dovra&#8217; iniziare dalla posizione (0,0).<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-03.jpg\" alt=\"Objective-C-UIWindow-UIView-03\" title=\"Objective-C-UIWindow-UIView-03\" width=\"222\" height=\"333\" class=\"aligncenter size-full wp-image-7311\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-03.jpg 222w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-03-200x300.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-03-100x150.jpg 100w\" sizes=\"auto, (max-width: 222px) 100vw, 222px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Per ottenere questo risultato operiamo una trasposizione di coordinate, rispetto a quelle ottenute dal metodo applicationFrame:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nCGRect viewBounds = [ [ UIScreen mainScreen ] applicationFrame ];\r\nviewBounds.origin.y = 0.0;\r\n<\/pre>\n<p>Useremo queste nuove coordinate per renderizzare a schermo la vista:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nUIView *myView = [ [ UIView alloc ] initWithFrame: viewBounds ];\r\n<\/pre>\n<p>Adesso che la view e la window sono state create correttamente, bisogna occuparsi della visualizzazione a schermo. Per fare questo, aggiungiamo la view alla window utilizzando il metodo di addSubview:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[ window addSubview: myView ];\r\n<\/pre>\n<p>L&#8217;ultimo passo da effettuare e&#8217; quello di mettere in primo piano e visualizzare la window. Il metodo da usare in questo caso e&#8217; makeKeyAndVisibile.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[ window makeKeyAndVisibile ];\r\n<\/pre>\n<h4>Un esempio completo<\/h4>\n<p>Prima di passare all&#8217;uso del modello ViewController, proveremo ad usare quanto appreso per creare un semplice applicativo che illustra le caratteristiche e le funzionalita&#8217; sopra esposte. Per prima cosa, apriremo Xcode creando un nuovo progetto:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-04.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-04.jpg\" alt=\"Objective-C-UIWindow-UIView-04\" title=\"Objective-C-UIWindow-UIView-04\" width=\"368\" height=\"378\" class=\"aligncenter size-full wp-image-7312\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-04.jpg 368w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-04-292x300.jpg 292w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-04-146x150.jpg 146w\" sizes=\"auto, (max-width: 368px) 100vw, 368px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Scegliamo il template Window-based Application e diamo un nome appropriato al nostro progetto. Ricordiamoci che il nome del progetto sara&#8217; anche la prima parte del nome delle nostre classi autogenerate. Dare un nome significativo, quindi, e&#8217; quanto mai importante.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-05.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-05.jpg\" alt=\"Objective-C-UIWindow-UIView-05\" title=\"Objective-C-UIWindow-UIView-05\" width=\"450\" height=\"331\" class=\"aligncenter size-full wp-image-7313\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-05.jpg 450w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-05-300x220.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-05-150x110.jpg 150w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Sulla parte di destra, troviamo tutte le risorse ed i files necessari alla corretta compilazione del nostro progetto. Il template, in automatico, genera per noi anche un file di risorse con estensione .xib, contenente tutte le informazioni per la generazione di un interfaccia grafica modificabile attraverso Interface Builder. Visto che stiamo lavorando programmaticamente, non sara&#8217; necessario fare uso di questo file. Selezionamo il file e con il tasto destro scegliamo l&#8217;opzione Delete.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-06.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-06.jpg\" alt=\"Objective-C-UIWindow-UIView-06\" title=\"Objective-C-UIWindow-UIView-06\" width=\"450\" height=\"360\" class=\"aligncenter size-full wp-image-7314\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-06.jpg 450w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-06-300x240.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-06-150x120.jpg 150w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Dobbiamo effettuare un&#8217;ultima importante modifica al template autogenerato. Selezioniamo il file main.m dalla voce Other Sources.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-07.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-07.jpg\" alt=\"Objective-C-UIWindow-UIView-07\" title=\"Objective-C-UIWindow-UIView-07\" width=\"334\" height=\"338\" class=\"aligncenter size-full wp-image-7315\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-07.jpg 334w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-07-296x300.jpg 296w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-07-64x64.jpg 64w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-07-148x150.jpg 148w\" sizes=\"auto, (max-width: 334px) 100vw, 334px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Il file main.m contiene alcune inizializzazioni fondamentali per la nostra applicazione.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-08.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-08.jpg\" alt=\"Objective-C-UIWindow-UIView-08\" title=\"Objective-C-UIWindow-UIView-08\" width=\"422\" height=\"248\" class=\"aligncenter size-full wp-image-7316\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-08.jpg 422w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-08-300x176.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-08-150x88.jpg 150w\" sizes=\"auto, (max-width: 422px) 100vw, 422px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Viene creato un NSAutoreleasePool, responsabile di controllare l&#8217;autorilascio di tutti gli oggetti allocati in memoria che fanno uso del metodo autorelease.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\r\n\/*\r\n...\r\n\r\nTutti gli oggetti che verranno creati in questo range,\r\nsaranno gestiti dall'oggetto NSAutorelase.\r\n\r\n...\r\n*\/\r\n[pool release];\r\n<\/pre>\n<p>Il ciclo main, inoltre, invoca la funzione UIApplicationMain. Questa funzione e&#8217; responsabile della creazione dell&#8217;oggetto applicazione &#8211; in seguito vedremo come riferirci a questo particolare oggetto attraverso le keywords UIApplication e sharedApplication &#8211; e della configurazione del suo delegato principale.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-09.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-09.jpg\" alt=\"Objective-C-UIWindow-UIView-09\" title=\"Objective-C-UIWindow-UIView-09\" width=\"400\" height=\"267\" class=\"aligncenter size-full wp-image-7317\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-09.jpg 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-09-300x200.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-09-150x100.jpg 150w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><br \/>\n<\/center><\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nint UIApplicationMain (\r\nint argc,\r\nchar *argv[],\r\nNSString *principalClassName,\r\nNSString *delegateClassName\r\n);\r\n<\/pre>\n<p>Nella figura sopra e&#8217; evidenziata la sintassi della funzione UIApplicationMain; l&#8217;argomento di nostro interesse e&#8217; il quarto. delegateClassName indica la classe designata come Application Delegate per la nostra applicazione. Per il template autogenerato questo parametro e&#8217; impostato a nil perche&#8217; quest&#8217;assegnazione e&#8217; fatta in fase di runtime dal file di risorse .xib. Ricordiamo, pero&#8217;, che nel passo precedente abbiamo eliminato ogni riferimento ad interface builder. Dovremo, quindi, impostare in maniera programmatica questo delegato.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-10.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-10.jpg\" alt=\"Objective-C-UIWindow-UIView-10\" title=\"Objective-C-UIWindow-UIView-10\" width=\"508\" height=\"269\" class=\"aligncenter size-full wp-image-7318\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-10.jpg 508w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-10-300x158.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-10-150x79.jpg 150w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Impostando l&#8217;ultimo parametro della funzione ad una stringa statica, indicante il nome della classe delegata, stiamo legando il nostro ciclo di runtime principale alla classe evidenziata nella figura sotto.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-11.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-11.jpg\" alt=\"Objective-C-UIWindow-UIView-11\" title=\"Objective-C-UIWindow-UIView-11\" width=\"318\" height=\"349\" class=\"aligncenter size-full wp-image-7319\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-11.jpg 318w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-11-273x300.jpg 273w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-11-136x150.jpg 136w\" sizes=\"auto, (max-width: 318px) 100vw, 318px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Per creare un delegato per la nostra applicazione, dobbiamo essere sicuri che la classe indicata &#8211; ViewBasedAppDelegate &#8211; adotti il protocollo richiesto: UIApplicationDelegate.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-12.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-12.jpg\" alt=\"Objective-C-UIWindow-UIView-12\" title=\"Objective-C-UIWindow-UIView-12\" width=\"422\" height=\"252\" class=\"aligncenter size-full wp-image-7320\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-12.jpg 422w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-12-300x179.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-12-150x89.jpg 150w\" sizes=\"auto, (max-width: 422px) 100vw, 422px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La sintassi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@interface ViewBasedAppDelegate: NSObject <UIApplicationDelegate> {\r\n...\r\n...\r\n}\r\n<\/pre>\n<p>indica che la classe specificata, adottera&#8217; il protocollo UIApplicationDelegate. Adottare un protocollo significa implementare tutti, o parte, dei metodi richiesti nella specifica dello stesso. Nel nostro esempio, adottando il protocollo UIApplicationDelegate, implementeremo un solo metodo opzionale: applicationDidFinishLaunching:.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-13.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-13.jpg\" alt=\"Objective-C-UIWindow-UIView-13\" title=\"Objective-C-UIWindow-UIView-13\" width=\"427\" height=\"300\" class=\"aligncenter size-full wp-image-7321\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-13.jpg 427w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-13-300x210.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-13-150x105.jpg 150w\" sizes=\"auto, (max-width: 427px) 100vw, 427px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Implementando il metodo applicationDidFinishLaunching: cattureremo il messaggio che il ciclo main dell&#8217;applicazione, lancera&#8217; alla nostra classe delegata quando tutte le operazioni di inizializzazione saranno complete.<\/p>\n<p>Adottare un protocollo, quindi, significa implementare le azioni\/risposte ai messaggi di nostro interesse. In questo caso, adottando il protocollo UIApplicationDelegate ed implementandone il messaggio applicationDidFinishLaunching:, creeremo un&#8217;azione di risposta al messaggio lanciato dal ciclo main dell&#8217;applicazione, dopo l&#8217;inizializzazione della stessa.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-14.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-14.jpg\" alt=\"Objective-C-UIWindow-UIView-14\" title=\"Objective-C-UIWindow-UIView-14\" width=\"400\" height=\"175\" class=\"aligncenter size-full wp-image-7322\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-14.jpg 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-14-300x131.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-14-150x65.jpg 150w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Il codice di creazione della window e delle view sara&#8217; inserito all&#8217;interno di questo metodo, come risposta al messaggio applicationDidFinishLaunching:, lanciato dal ciclo main dell&#8217;applicazione.<\/p>\n<h4>Inizializzazione e creazione degli elementi base<\/h4>\n<p>Come detto, per questo primo esempio, utilizzeremo direttamente il messaggio applicationDidFinishLaunching: per creare e renderizzare a schermo il nostro esempio. Gli oggetti che useremo nell&#8217;applicativo vanno dichiarati nell&#8217;interfaccia della classe.<\/p>\n<p>Selezioniamo il file di interfaccia &#8211; MVC1AppDelegate.h ed inseriamo le dichiarazioni necessarie:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-15.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-15.jpg\" alt=\"Objective-C-UIWindow-UIView-15\" title=\"Objective-C-UIWindow-UIView-15\" width=\"223\" height=\"156\" class=\"aligncenter size-full wp-image-7323\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-15.jpg 223w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-15-150x104.jpg 150w\" sizes=\"auto, (max-width: 223px) 100vw, 223px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-16.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-16.jpg\" alt=\"Objective-C-UIWindow-UIView-16\" title=\"Objective-C-UIWindow-UIView-16\" width=\"396\" height=\"252\" class=\"aligncenter size-full wp-image-7324\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-16.jpg 396w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-16-300x190.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-16-150x95.jpg 150w\" sizes=\"auto, (max-width: 396px) 100vw, 396px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Cominciamo con l&#8217;inserire il seguente codice all&#8217;interno del metodo designato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-17.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-17.jpg\" alt=\"Objective-C-UIWindow-UIView-17\" title=\"Objective-C-UIWindow-UIView-17\" width=\"541\" height=\"179\" class=\"aligncenter size-full wp-image-7325\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-17.jpg 541w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-17-300x99.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-17-150x49.jpg 150w\" sizes=\"auto, (max-width: 541px) 100vw, 541px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>una volta inizializzate la finestra &#8211; window &#8211; e la view &#8211; myView &#8211; procediamo con la colorazione del background di quest&#8217;ultima.<\/p>\n<p>Vogliamo aggiungere alla nostra applicazione una barra di stato che rifletta gli eventi che si susseguiranno durante l&#8217;uso. Per fare questo, aggiungiamo alla view principale un&#8217;oggetto UILabel opportunamente configurato.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-18.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-18.jpg\" alt=\"Objective-C-UIWindow-UIView-18\" title=\"Objective-C-UIWindow-UIView-18\" width=\"451\" height=\"145\" class=\"aligncenter size-full wp-image-7326\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-18.jpg 451w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-18-300x96.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-18-150x48.jpg 150w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come si puo&#8217; notare nelle ultime tre righe, dopo il rilascio continuiamo a referenziare la statusBar. Questo e&#8217; possibile grazie al concetto di retain\/release. Il nostro oggetto, infatti, prima di essere rilasciato e&#8217; stato aggiunto alla view principale &#8211; addSubiew: -, incrementandone di fatto il contatore di uso. Effettuare un release, quindi, significa decrementare il contatore di uso e demandare la responsabilita&#8217; della distruzione dell&#8217;oggetto alla view che lo contiene. Quando distruggeremo la view principale, il contatore dell&#8217;oggetto statusBar verra&#8217; decrementato, raggiungendo il valore di zero ed un conseguente rilascio della memoria impiegata.<\/p>\n<p>La tecnica sopra descritta risultera&#8217; utile quando ci troveremo a dialogare con molti oggetti all&#8217;interno di una gerarchia di viste; in questo modo, potremo dispensarci dalla deallocazione manuale dei singoli oggetti, demandando tutto all&#8217;oggetto padre che li contiene.<\/p>\n<p>Proviamo ad aggiungere due nuovi oggetti alla nostra view. UIButton fornisce i metodi e le caratteristiche base per la creazione e gestione di un bottone all&#8217;interno di una view.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-19.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-19.jpg\" alt=\"Objective-C-UIWindow-UIView-19\" title=\"Objective-C-UIWindow-UIView-19\" width=\"550\" height=\"176\" class=\"aligncenter size-full wp-image-7327\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-19.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-19-300x96.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-19-150x48.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>button1 viene istanziato attraverso l&#8217;uso del metodo di classe buttonWithType:. Questo metodo, prende un tipo predefinito per il nostro bottone ed inizializza l&#8217;oggetto. Anche UIButton eredita dalla classe UIView. In particolare, l&#8217;oggetto UIButton specializza la classe UIControl che, a sua volta, specializza la classe UIView<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-20.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-20.jpg\" alt=\"Objective-C-UIWindow-UIView-20\" title=\"Objective-C-UIWindow-UIView-20\" width=\"100\" height=\"208\" class=\"aligncenter size-full wp-image-7308\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Questa particolare struttura, ci permettera&#8217; di individuare dei comportamenti (e metodi) comuni a moltissimi oggetti che ereditano dalla classe UIControl.<\/p>\n<p>Prima di tutto, inizializziamo un frame adatto a contenere il nostro bottone. L&#8217;uso del metodo setFrame:, abbinato alla funzione CGRectMake(), fornisce il punto di partenza per creare uno spazio a schermo per il nostro oggetto.<\/p>\n<p>Visto che si tratta di un bottone che dovra&#8217; rispondere ad eventi di pressione, utilizzeremo un metodo comune a tutti gli oggetti della classe UIControl.<\/p>\n<p>addTarget:(id)target action:(selector)anAction forControlEvents:(UIControlEventsType)type aggiunge, al bottone appena creato, un metodo risponditore &#8211; anAction &#8211; per l&#8217;evento type. Il parametro target, specifica in quale classe dovra&#8217; essere cercato il metodo specificato nel parametro action.<\/p>\n<p>Cosi&#8217;, la riga:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[button1 addTarget:self action:@selector(leftPressed)\r\n              forControlEvents:UIControlEventTouchUpInside];\r\n<\/pre>\n<p>Aggiunge il supporto per l&#8217;evento di pressione ( UIControlEventTouchUpInside ), demandando il controllo ad un metodo chiamato leftPressed, facente parte della classe attuale ( self ).<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-21.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-21.jpg\" alt=\"Objective-C-UIWindow-UIView-21\" title=\"Objective-C-UIWindow-UIView-21\" width=\"446\" height=\"56\" class=\"aligncenter size-full wp-image-7328\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-21.jpg 446w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-21-300x37.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/Objective-C-UIWindow-UIView-21-150x18.jpg 150w\" sizes=\"auto, (max-width: 446px) 100vw, 446px\" \/><\/a><br \/>\n<\/center><\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/07\/MVC-Objective-C-UIWindow-UIView.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\/07\/MVC-Objective-C-UIWindow-UIView.zip\" target=\"_blank\">questo \u00e8 il link per scaricare il nostro esempio completo.<\/a><\/p>\n<h4>Riferimenti<\/h4>\n<ul>\n<li><a href=\"http:\/\/developer.apple.com\/library\/ios\/#documentation\/iPhone\/Conceptual\/iPhoneOSProgrammingGuide\/Introduction\/Introduction.html\" target=\"_blank\">iOS Developer Library: iOS Application Programming Guide<\/a><\/li>\n<li><a href=\"http:\/\/developer.apple.com\/library\/ios\/#documentation\/WindowsViews\/Conceptual\/ViewPG_iPhoneOS\/Introduction\/Introduction.html\" target=\"_blank\">iOS Developer Library: View Programming Guide for iOS<\/a><\/li>\n<li><a href=\"http:\/\/www.amazon.com\/iPhone-SDK-Application-Development-Applications\/dp\/0596154054\" target=\"_blank\">iPhone SDK Application Development &#8211; Capitoli 2 e 3<\/a><\/li>\n<\/ul>\n<p><center><br \/>\n<a href=\"http:\/\/www.iphonesmartapps.org\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg\" alt=\"banner-iphoneSmartApps-org\" title=\"banner-iphoneSmartApps-org\" width=\"468\" height=\"54\" class=\"aligncenter size-full wp-image-6174\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1.jpg 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-300x34.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/bn-iphoneSmartApps-org1-150x17.jpg 150w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&#8217;elemento base della user interface e&#8217; l&#8217;oggetto UIWindow. Esso fornisce il supporto per mostrare informazioni ed oggetti&#8230;<\/p>\n","protected":false},"author":476,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[605],"tags":[529,851,848,50,849,845,846,465,852,242,850,63,847],"class_list":["post-7302","post","type-post","status-publish","format-standard","hentry","category-guida-rapida-alla-programmazione-cocoa-touch","tag-addsubview","tag-bounds","tag-cgpoint","tag-cgrect","tag-cgsize","tag-corso-objective-c","tag-guida-cocoa-touch","tag-initwithframe","tag-makekeyandvisible","tag-tutorial-xcode","tag-uiscreen","tag-uiview","tag-uiwindow"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7302","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\/476"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=7302"}],"version-history":[{"count":10,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7302\/revisions"}],"predecessor-version":[{"id":7334,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7302\/revisions\/7334"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=7302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=7302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=7302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}