CGRectMake() è una funzione (in realtà è un inline #define) molto usata soprattutto quando si creano da codice oggetti grafici o di interfaccia utente. Il suo utilizzo è quindi spesso legato all’inizializzazione di componenti UIKit, ma anche a semplici UIView o UIImageView. CGRectMake() restituisce una struct (struttura di tipo) CGRect:
1 2 3 4 5 | struct CGRect { CGPoint origin; CGSize size; }; typedef struct CGRect CGRect; |
Che a sua volta è composta da due diverse struct CGPoint e CGSize:
1 2 3 4 5 6 7 8 9 10 11 12 13 | struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; /* Sizes. */ struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize; |
Che, a loro volta ancora, contengono tipi CGFloat, ovvero tipi float. Se andiamo ad analizzare il codice della CGRectMake() troviamo:
1 2 3 4 5 6 7 8 | CG_INLINE CGRect CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) { CGRect rect; rect.origin.x = x; rect.origin.y = y; rect.size.width = width; rect.size.height = height; return rect; } |
Ne deriva, quindi, che questa parte di codice:
1 2 3 4 | UIButton *gbutton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; gbutton.frame = CGRectMake (12,409,100,40); [gbutton setTitle:@"Press" forState:UIControlStateNormal]; [mainWindow addSubview:gbutton]; |
Potrebbe, a ragione, essere scritta anche come:
1 2 3 4 | UIButton *gbutton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; gbutton.frame = (CGRect) {12,409,100,40}; [gbutton setTitle:@"Press" forState:UIControlStateNormal]; [mainWindow addSubview:gbutton]; |
Giusto per velocizzare un po’ l’esecuzione del codice…









7
Curiosita’: se si volesse imparare l’Obj-C, diciamo, da zero o quasi, a quali pubblicazioni ci si puo’ rivolgere?
@Cristian: cerca su Google Book (Google Libri) ci sono molte risorse (in inglese) quasi complete.
Pessimo consiglio, mi dispiace. Riduce l’incapsulamento del codice (che succede se viene cambiata l’implementazione di
CGRectMake? Il mio codice funziona e il tuo va modificato) e la differenza in termini di prestazioni è impercettibile (tra l’altroCGRectMakeè inline, ma la differenza sarebbe impercettibile anche se fosse una funzione vera e propria).Questo consiglio incarna tra l’altro l’anti-pattern dell’ottimizzazione prematura.
@kheimon: concordo, ad oggi non la userei mai in un codice reale, soprattutto in relazione alla
CGRect, visti gli aggiornamenti continui all’iOS. Tuttavia è interessante mostrare come struct di quel tipo possono essere linearizzare a bisogno.