10 utili trucchi e snippet per Apple iPhone e Xcode
giovedì 12 novembre, 20091. 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | NSString *htmlData = @" \ <html><head> \ <style type=\"text/css\"> \ body {background:#000;color:#fff} \ </style> \ <title>Report</title></head> \ <body> \ <h1>Prova HTML</h1> \ <ul> \ <li>Testo HTML</li> \ <li>Inserito su</li> \ <li>piu' righe</li> \ </ul></body></html>"; [webView loadHTMLString:htmlData baseURL:[NSURL URLWithString:@"http://www.saidmade.com/"]]; |
2. Transizioni tra View con effetto “foglio piegato”
Ecco una funzione utile per sfogliare, e risflogliare, due UIView:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Esegue una transizione con effetto CURL da una UIView a una UIView // @params placeholder (UIView) principale // @params fview (UIView) di partenza // @params tview (UIView) di arrivo // @params forward (BOOL) sfoglia verso l'alto o verso il basso - (void)makeTansitionFromView:(UIWindow *)placeholder fromView:(UIView *)fview toView:(UIView *)tview forward:(BOOL)forward { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:1.5]; [UIView setAnimationTransition:forward?UIViewAnimationTransitionCurlUp:UIViewAnimationTransitionCurlDown forView:placeholder cache:YES]; [tview removeFromSuperview]; [placeholder addSubview:fview]; [fview removeFromSuperview]; [placeholder addSubview:tview]; [UIView commitAnimations]; } |
Può essere utilizzata in questo modo:
1 2 3 4 | // visualizzo - sfoglio in avanti [self makeTansitionFromView:window fromView:primaView.view toView:secondaView.view forward:YES]; // nascondo - sfoglio indietro [self makeTansitionFromView:window fromView:secondaView.view toView:primaView.view forward:NO]; |
3. Impedire l’auto oscuramento del display
Da usare con cura, pena il consumo immediato della batteria, questa riga di codice permette di mantenere la nostra applicazione sempre visibile, impedendo che l’Apple iPhone vada in “stand-by”:
1 | [UIApplication sharedApplication].idleTimerDisabled = YES; |
4. Network Activity Indicator
L’animazione che compare sulla barra di stato in alto allo schermo dell’Apple iPhone, può essere utilizzata anche nelle nostre applicazioni per sottolineare un’attività di rete:
1 2 3 4 5 6 7 | // Mostra Network Activity Indicator ... [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; // Le tue operazioni ... // Nasconde Network Activity Indicator ... [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; |
5. Activity Indicator personale
Se non si dispone della barra di stato, può tornare utile mostrare un nostro Activity Indicator:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // globale da qualche parte... dipo in un Delegate (.h) UIActivityIndicatorView *activity; // Nella loadView o viewDidLoad inizializziamo l'Activity Indicator activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; [self.view addSubview:activity]; [activity setCenter:CGPointMake(160, 240)]; [activity stopAnimating]; // Quando ci serve -(void)someMethod { [activity startAnimating]; // to doing... [activity stopAnimating]; } |
6. Localizzazione
Tramite questo snippet è possibile capire in che “lingua” è impostato il nostro device:
1 2 3 4 5 6 7 | // Checking language and localization NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSArray *languages = [defaults objectForKey:@"AppleLanguages"]; NSString *currentLanguage = [languages objectAtIndex:0]; NSLog(@"Current Locale: %@", [[NSLocale currentLocale] localeIdentifier]); NSLog(@"Current language: %@", currentLanguage); |
7. iPhone o iPod?
Questa classe è utilissima per determinare su quale dispositivo Apple sta funzionando la nostra applicazione. Non solo possiamo determinare il modello (iPhone o iPod Touch) ma anche la versione. Create due file UIDevice-hardware.h e UIDevice-hardware.m:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // UIDevice-hardware.h #import <UIKit/UIKit.h> #define IPHONE_1G_NAMESTRING @"iPhone 1G" #define IPHONE_3G_NAMESTRING @"iPhone 3G" #define IPHONE_3GS_NAMESTRING @"iPhone 3GS" #define IPOD_1G_NAMESTRING @"iPod touch 1G" #define IPOD_2G_NAMESTRING @"iPod touch 2G" @interface UIDevice (Hardware) - (NSString *) platform; - (NSString *) platformString; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | // UIDevice-hardware.m #import "UIDevice-hardware.h" #include <sys/types.h> #include <sys/sysctl.h> @implementation UIDevice (Hardware) /* Platforms iPhone1,1 = iPhone 1G iPhone1,2 = iPhone 3G iPhone2,1 = iPhone 3GS iPod1,1 = iPod touch 1G iPod2,1 = iPod touch 2G */ - (NSString *) platform { size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = malloc(size); ysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *platform = [NSString stringWithCString:machine]; free(machine); return platform; } - (NSString *) platformString { NSString *platform = [self platform]; if ([platform isEqualToString:@"iPhone1,1"]) return IPHONE_1G_NAMESTRING; if ([platform isEqualToString:@"iPhone1,2"]) return IPHONE_3G_NAMESTRING; if ([platform isEqualToString:@"iPhone2,1"]) return IPHONE_3GS_NAMESTRING; if ([platform isEqualToString:@"iPod1,1"]) return IPOD_1G_NAMESTRING; if ([platform isEqualToString:@"iPod2,1"]) return IPOD_2G_NAMESTRING; return NULL; } @end |
Nel nostro Delegate possiamo inserire:
1 2 3 4 5 6 | #import "UIDevice-hardware.h" // - (void)checkDeviceTypeAndCapabilities { NSLog(@"type: %@", [[UIDevice currentDevice] platform]); NSLog(@"type: %@", [[UIDevice currentDevice] platformString]); } |
8. Camera
Quando si scrive un’applicazione che usa l’accesso alle funzioni della Camera è bene verificare che il “device” supporti tali funzionalità (come da direttive Apple):
1 2 3 4 5 6 | UIImagePickerController *imgPicker; // ... if ( ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])) { self.imgPicker.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentModalViewController:self.imgPicker animated:YES]; } |
9. Photo Album & Photo Library
Similmente a quello che accade con la Camera, è bene effettuare gli giusti controlli anche quando si accede alla libreria delle immagini:
1 2 3 4 5 6 7 8 9 10 11 | UIImagePickerController *imgPicker; // ... if ( ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])) { self.imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; [self presentModalViewController:self.imgPicker animated:YES]; } // oppure ... if ( ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])) { self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:self.imgPicker animated:YES]; } |
10. Disponibilità e tipo di rete
Fortunatamente Apple ha scritto per noi una classe per determinare lo stato della rete. Questa può essere utilizzata nella nostra applicazione sia per verificare la presenza di rete che la sua tipologia: ethernet o WiFi. Scaricate Reachability.h e Reachability.m. Aggiungete il Framework SystemConfiguration.framework. A questo potete scrivere una funzione tipo:
1 2 3 4 5 6 7 8 9 10 | // nel tuo Delegate .h @class Reachability; // // nel Delegate .m #import "Reachability.h" // Verifica copertura rete - (BOOL)CheckNetworkStatus { return ([[Reachability reachabilityForInternetConnection] retain] != NotReachable); } |
Attenzione che il codice presente su Apple, il cui sorgente completo è reperibile in Reachability.zip, è per le SDK 3.1.2. Se provate a compilare per le SDK 2.2.1 dovete commentare alcune parti di codici non supportate dalle “vecchie” (anche se ancora presenti) SDK; come le define:
1 2 | kSCNetworkReachabilityFlagsConnectionOnTraffic kSCNetworkReachabilityFlagsConnectionOnDemand |
e la parte di codice (da commentare):
1 2 3 4 5 6 7 8 9 10 11 12 | // if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || // (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) // { // // ... and the connection is on-demand (or on-traffic) if the // // calling application is using the CFSocketStream or higher APIs // // if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) // { // // ... and no [user] intervention is needed // retVal = ReachableViaWiFi; // } // } |











1

Non ci sono commenti per questo Post
Lascia un commento