Aggiungere una cartella (es. di file HTML) senza perdere la struttura di sottocartelle

Chi ha voluto inserire una cartella di file HTML all’interno di un progetto Xcode si sarà presto accorto che i file vengono trattati come se fossero tutti dentro la cartella principale, e non distribuiti nelle eventuali sottocartelle. Questo crea problemi, ad esempio, nel linkare i file immagine nel file HTML (che andrebbe modificato ad hoc). Ma non solo.

Per ovviare a questo inconveniente è sufficiente ricordarsi di importare la cartella scegliendo l’opzione “Create folder references for any added folders ” (pur con l’opzione Copy items into destination group’s folder (if needed)” attivata).

Tip: includere un immagine in una mail con MFMailComposeViewController

Quando apriamo l’MFMailComposeViewController, come view modale, potremmo voler includere una immagine nel corpo del messaggio.

Nonostante su stackoverflow.com esista una soluzione per incorporare una immagine contenuta nel bundle dell’app, ritengo che, quando possibile, la soluzione migliore sia usare un corpo del messaggio in formato HTML e usare il tag img per usare una immagine caricata da remoto su un nostro server.

Questo richiede una connessione, ma ovviamente anche l’invio dell’email lo richiede. Inoltre l’immagine non grava sul peso totale del messaggio. Unico inconveniente è il non poter usare una immagine creata tramite l’app (a meno di complicati upload sul server, prima di creare il messaggio HTML).

Se però non abbiamo necessità particolare nell’impaginazione dell’immagine, possiamo utilizzare il semplice comando di creazione di un allegato (che Mail mostra comunque in automatico):

1
2
3
4
5
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:imageName]; 
NSData *imageData = [NSData dataWithContentsOfFile:dataFilePath];
[mailComposer addAttachmentData:imageData mimeType:@"image/png" fileName:imageName];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentsDirectory = [paths objectAtIndex:0];
	NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:imageName]; 
NSData *imageData = [NSData dataWithContentsOfFile:dataFilePath];
[mailComposer addAttachmentData:imageData mimeType:@"image/png" fileName:imageName];

Abilitare e disabilitare i pulsanti Avanti e Indietro di un UIWiebView

Quando serve di caricare una pagina HTML in una app, può essere utile abilitare i link e quindi necessario poter andare avanti e indietro nella cronologia di navigazione. Questi movimenti fanno parte del corredo di UIWebView e si chiamano goForward e goBack: possono essere collegati ad dei pulsanti dell’interfaccia.

È utile però disabilitare questi pulsanti quando il movimento non è possibile. Ad esempio non è possibile andare indietro quando si è alla prima pagina HTML aperta, come non è possibile andare avanti quando si è sull’ultima. Per gestire tutto questo è necessario che il ViewController che ospita la WebView implementi il protocollo UIWebViewDelegate e che si implementi in particolare il metodo seguente (fonte):

1
2
3
4
5
6
7
8
9
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
  // Enable or disable back
  [myBackButton setEnabled:[myWebView canGoBack]];
 
  // Enable or disable forward
  [myForwardButton setEnabled:[myWebView canGoForward]];
 
 }
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
  // Enable or disable back
  [myBackButton setEnabled:[myWebView canGoBack]];

  // Enable or disable forward
  [myForwardButton setEnabled:[myWebView canGoForward]];

 }

Grazie ai metodi canGoBack e canGoForward, quindi, i pulsanti vengono abilitati solo quando è possibile usarli. L’interfaccia è ora molto più coerente e intuitiva.

UIWebView con sfondo trasparente [AGGIORNATO]

Talvolta è necessario usare una UIWebView per visualizzare un testo formattato in maniera particolare, con immagini ed altri elementi inclusi. Si tratta di un modo semplice senza ricorrere a RTF o PDF.

In questo caso allora uno sfondo trasparente è l’ideale.

Tre sono le cose da fare per ottenere una webview con sfondo trasparente:

  1. Impostare il Background dell’oggetto UIWebView a Clear*
  2. Disattivare l’opzione Opaque dell’oggetto UIWebView
  3. Settare il CSS (o l’attributo HTML) in modo che il tag body abbia background-color: transparent.

*Aggiornamento: se la UIWebView è all’interno di una UITableViewCell, questa proprietà va settata, a causa di un bug in UIKit, nel metodo

1
-(void)setSelected:(BOOL)selected animated:(BOOL)animated
-(void)setSelected:(BOOL)selected animated:(BOOL)animated

altrimenti, in iOS 4, lo sfondo sarà grigio (fonte).

Caricare un stringa come contenuto HTML di una UIWebView

Quando si utilizza una UIWebView si può caricare il contenuto HTML a partire da un sito web o da un file presente nel bundle dell’applicazione, ed allora si usa la classe NSURLRequest, altrimenti si può utilizzare il contenuto di una NSString, magari appositamente modificata per far apparire la pagina ipertestuale come desideriamo. In questo caso allora è sufficiente usare il seguente comando:

1
[webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:@""]];
[webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:@""]];