Eseguire un metodo dopo n secondi
Tutta la famiglia performSelector è davvero interessante e può essere utile in una moltitudine di casi. La sua applicazione più semplice e comune è la seguente:
1 2 3 4 5
| [self performSelector:@selector(myMethod) withObject:nil afterDelay:3];
//
- (void)myMethod {
NSLog(@"Hello World!");
} |
Tuttavia considerate che il “timer” non è preciso. Questa procedura, quindi, va usata quando non è richiesta una “notevole” precisione temporale.
Recuperare la versione dell’applicazione
1 2
| NSString *version = [[[NSBundle mainBundle ] infoDictionary ] objectForKey :@"CFBundleVersion"];
NSLog (@"versione = %@", version ); |
YES, true o TRUE?
Andando a spulciare nel Kernel Apple iPhone è possibile renderci conto che YES, true e TRUE sono in pratica la stessa edentica cosa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| // definizione di YES
#define YES (BOOL)1
#define NO (BOOL)0
// definizione di true
#define true 1
#define false 0
// definizione di TRUE
#if !defined(TRUE)
#define TRUE 1
#endif
#if !defined(FALSE)
#define FALSE 0
#endif |
Almeno per adesso…
Vibrazione
1 2 3
| #import <AudioToolbox/AudioToolbox.h>
//
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); |
Puntatore CGImageRef a partire da un UIImage
1 2 3 4
| UIImage *heart = [UIImage imageNamed:@"LittleHeart.png"];
CGImageRef image = [heart CGImage];
// L'immagine adesso può essere "rasterizzata" su un CGContextRef
CGContextDrawImage(c, (CGRect){0, 0, 100, 100}, image); |
Animazioni
1 2 3 4 5
| [UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
// ...
[UIView commitAnimations]; |
NSLog
1 2 3
| NSLog(@"NSString object %@ ", myString);
NSLog(@"Float: %f ", myFloat);
NSLog(@"Integer: %i ", myInt); |
Convertitore da RGB a UIColor
1
| #define RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a] |
Passare parametri ad un NSTimer
Sfruttando il parametro userInfo è possibile inviare un puntatore ad un nostro oggetto al metodo richiamato da timer.
1 2 3 4 5 6 7 8 9 10 11 12 13
| [NSTimer scheduledTimerWithTimeInterval :1 target :self selector :@selector(timerMethod ) userInfo :objectPointer repeats :YES];
// ...
-(void)timerMethod :(NSTimer*)timer {
// Recupero il puntatore al mio oggetto
objectPointer = [timer userInfo ];
// oppure
[[timer userInfo ] myMethod ];
int a = [[timer userInfo ] myProperty ];
// che è lo stesso
int a = [objectPointer myProperty ];
} |
Tempo di esecuzione
Ecco un semplice modo per calcolare tempi brevi utili per verificare la velocità di esecuzione del codice:
1 2 3 4
| CFAbsoluteTime initialTime = CFAbsoluteTimeGetCurrent();
// ... code
CFAbsoluteTime finalTime = CFAbsoluteTimeGetCurrent();
NSLog(@"Tempo trascorso %f", finalTime-initialTime); |
Continua...
Gli stati UIControlStateSelected o UIControlStateHighlighted non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom! O meglio, non funzionano come dovrebbero (perchè riservati agli altri tipi di bottone), ad esempio per creare un bottone a due stati: toggle appunto. Se abbiamo creato due immagini (stato1.png e stato2.png) per il nostro bottone, possiamo procedere in questo modo:
1 2 3
| // Nell'header file creiamo una variabile globale che usaremo per
// controllare il toggle state
BOOL toggleFlag; |
Ora creiamo il nostro bottone:
1 2 3 4 5 6 7 8 9
| // Creaiamo un bottone e lo poniamo inizialmente nello stato "stato1.png"
// Modificate initWithFrame:(CGRect){100,100,50,50} con la posizione e
// dimensioni della vostra immmagine
toggleFlag = YES;
UIButton *toggleButton = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:(CGRect){100,100,50,50}];
[toggleButton setTitle:@"" forState:UIControlStateNormal];
[toggleButton setBackgroundImage:[UIImage imageNamed:@"stato1.png"] forState:UIControlStateNormal];
[toggleButton addTarget:self action:@selector(onToggle:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:toggleButton]; |
Quando si clicca sul bottone verrà inviato un messaggio gestito da onToggle:
1 2 3 4 5 6 7
| - (void)onToggle:(id)sender {
// Recupero puntatore al UIButton
UIButton *buttonClicked = (UIButton *)sender;
// Eseguo il toogle
toggleFlag = !toggleFlag;
[buttonClicked setBackgroundImage:[UIImage imageNamed:(toggleFlag) ? @"stato1.png" : @"stato2.png"] forState:UIControlStateNormal];
} |
Continua...
Un’alternativa davvero semplice per eseguire uno streaming di un file mp3 su Apple iPhone potrebbe essere:
Continua...
Oggi, 25 novembre 2009, nasce ufficialmente Mad Ideas, la prima fabbrica delle idee generate dagli utenti (UGI User Generated Ideas).
Continua...
Sia sul Mac OS X che sull’iPhone OS, abbiamo la possibilità di accedere in modo semplice e diretto alle directory – più importanti – di sistema, che sono:
1 2 3
| NSHomeDirectory Returns the path to the current user’s home directory.
NSHomeDirectoryForUser Returns the path to a given user’s home directory.
NSTemporaryDirectory Returns the path of the temporary directory for the current user. |
Continua...
1. Stringhe su più righe
In Xcode è possibile “spezzare” un stringa su più righe inserendo a alla fine un backslash “\”. Questa caratteristica può risultare utilissima quando, ad esempio, vogliamo inserire del testo HTML in un controllo UIWebView:
Continua...
La sintassi NSLog(@"%@", ... ); funziona ed è utilizzata per ottenere informazioni sugli oggetti, ma non funziona su tipi dato C come struct CGRect o CGPoint, ad esempio. Per poter sfruttare NSLog(@"%@", ... ); anche su struct di tipo C possiamo appoggiarci a funzioni di conversione come NSStringFromCGRect() o NSStringFromCGPoint:
1 2 3 4 5
| CGrect mioRect = (CGRect){10,20,30,40};
CGPoint mioPoint = (CGPoint){32,64};
//
NSLog( @"Info rettangolo: %@", NSStringFromCGRect(mioRect) );
NSLog( @"Info point: %@", NSStringFromCGPoint(mioPoint) ); |
Nello specifico è possibile perfezionare tale procedure scrivendosi delle piccole macro utili come:
1
| #define NSLogRect(rect) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f", #rect, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height) |
Oppure:
1 2 3 4
| #define NSLogCGPoint(point) NSLog(@"%s: (%0.0f, %0.0f)", #point point.x, point.y)
CGPoint mioPoint = (CGPoint){32,64};
NSLogCGPoint(mioPoint); |
Che darà come output:
Continua...
Icona applicazione
L’icona 57×57 pixel che andrà a rappresentare la nostra applicazione viene “alterata” automaticamente dall’Apple iPhone: viene aggiunto un bordo arrotondato, un effetto luminoso e 3D. Questa impostazione può essere cambiata selezionando il file [nome applicazione]-Info.plist e aggiungendo la property “Icon already includes gloss and bevel effects”:
Continua...
Se avete bisogno di generare numeri casuali in una applicazione Apple iPhone dovete mettere da parte Objective-C, in quanto non propone nessuna classe allo scopo. La soluzione viene dal C che propone: rand(), srand(), random(), srandom() e arc4random().
Continua...
Ultimi Commenti
Giovambattista Fazioli: @Nik: Sono contento! In bocca al lupo dunque!!
Nik: Lunedì ho l’esame di informatica su java, grazie mi sei stato utilissimo, il libro che ho era poco chiaro...
Marco: Ti ringrazio moltissimo, mi hai illuminato
ho risolto impostando [cc_objc] //OptionViewController.m -...
Giovambattista Fazioli: @Marco: Ti consiglio un approccio credo più corretto. Se hai eseguito il subclass del tab...
luigi: molto chiaro e semplice devo ammettere che anche scrivendo da un pà difficilmente uso delegati creati da...