Spiegato nel capitolo precedente che cosa è un ViewController ed a cosa serve, siamo pronti per disegnare la nostra view direttamente da codice. Per raggiungere il nostro obiettivo è possibile implementare il codice sia nel metodo loadView sia nel metodo viewDidLoad in quanto non è presente nessun file .xib da caricare. Dato che il lettore potrebbe usare questo progetto anche nei prossimi esempi collochiamo il codice nel metodo viewDidLoad. Il codice relativo alla creazione della view è il seguente:
CGRect frame = CGRectMake(80, 140, 160, 200);
self.view = [[UIView alloc] initWithFrame:frame];
self.view.backgroundColor=[UIColor blackColor];
La prima riga di codice dichiara un frame con il quale andremo ad inizializzare la nostra view. Come possiamo vedere il frame viene definito come tipo CGRect che è una struct che contiene un CGPoint e CGSize che a loro volta contengo due variabili di tipo float. Il frame viene creato utilizzando la funzione CGRectMake che, come vediamo, prende in input quattro parametri: i primi due indicano il punto di partenza dal quale iniziare a disegnare la view, mentre gli altri due indicano la larghezza e la lunghezza che avrà il frame. Per capire dove andremo ad inserire la nostra view definiamo come l’origine del sistema di riferimento – il punto (0,0) – il punto in alto a sinistra dello schermo del nostro dispositivo. Quindi, nel nostro caso, la view verrà disegnata spostandosi di 80 pixel sull’asse x e 140 sull’asse y.
Nella seconda linea di codice non facciamo altro che inizializzare la view con il frame creato precedentemente. Probabilmente l’attenzione di qualche lettore sarà caduta su self.view chiedendosi il significato di questo costrutto. Un’altra domanda che il lettore può farsi è il perchè nel file header del ViewController non viene dichiarata nessuna view, ma compilando il codice non emerga nessun errore. Rispondendo prima alla seconda domanda, possiamo dire che la classe UIViewController discende direttamente da UIView e dato che UIView contiene una dichiarazione di una view, eriditando la classe ereditiamo anche questa dichiarazione. Per accedere alla view si usa il costrutto self che indica che vogliamo la view di quest’oggetto. Per capirsi, il costrutto self ha lo stesso significato del costrutto this in molti linguaggi di programmazione come per esempio il Java.
Nella terza linea di codice andiamo ad accedere alla proprietà backgroundColor della vista e gli associamo il colore blu.
Se adesso andiamo ad aprire il file di implementazione del delegate troviamo la seguente linea di codice:
[window addSubview:viewController.view];
Questa linea di codice ha il compito di sovrapporre la view, che abbiamo creato nel ViewController, alla window dell’applicazione.
E’ possibile ultilizzare il metodo addSubView non solo con view ma anche con gli altri elementi UI come pere sempio UILabel e UIButton, dato che derivano tutti dalla super classe UIView.
E’ importante notare che il sistema di riferimento varia a seconda della view in cui applichiamo il metodo addSubView. Infatti se proviamo ad aggiungere, nel delegate, il seguente pezzo di codice:
CGRect frame1 = CGRectMake(0, 0, 70, 70);
UIView * view1;
view1 = [[UIView alloc] initWithFrame:frame1];
view1.backgroundColor=[UIColor redColor];
[viewController.view addSubview:view1];
Vedremo che viene disegnata un’altra view più piccola ubicata nell’origine della view del ViewController e non nell’origine della window.
Se dunque si vuole disegnare la view nell’origine o si esegue il metodo addSubView sulla window oppure si modificano i primi due parametri di CGRectMake inserendo dei valori negativi.
Per rimuovere una view dallo schermo basterà scrivere la seguente linea di codice:
[nomeView removeFromSuperView];