2011-10-29 9 views
7

Mi piacerebbe fare la mia app per iPhone per essere in grado di passare da una skin all'altra (o tema di design, o look and feel, come legno, metallo, colore della terra, uomo, ragazza, ecc ...).Come cambiare skin (o temi di progettazione) nell'app per iOS?

Preparerò alcuni set di skin contenenti immagini per pulsanti e sfondi, suoni e colore del testo e consentirò all'utente di decidere quale set di skin si desidera utilizzare dalle impostazioni dell'applicazione.

Qual è la migliore pratica per implementare questo?

Le condizioni sono:

  • mi piacerebbe usare Interface Builder
  • ho bisogno di sostenere iOS 3.1.3 e successivamente
  • Voglio fare i set di pelli scaricabili da internet (Non riesco a raggruppare tutte le skin nell'app, poiché un set di skin richiede molte immagini e le dimensioni del file dell'app potrebbero diventare enormi se lo faccio ... Inoltre, non voglio hardcode alcuna informazione su skin specifiche .)
  • Se uno skin personalizzato non contiene uno o alcuni elementi, (come un'immagine o r file audio), voglio che usi l'elemento mancante dal set di skin predefinito.
  • Non voglio creare file pennino per ogni skin. Il file pennino per una schermata dovrebbe essere l'unico nel bundle principale per facilitare la manutenzione.

sto pensando di fare una superclasse di tutti i UIViewControllers nella mia app e ignorare la parte che viene caricato il file Pennino, e invece di caricare dal fascio principale, caricare le risorse dalla pelle che viene salvato in la directory del documento ... ma non so come farlo ... Il comportamento predefinito dei metodi di caricamento del pennino carica sempre le risorse dal pacchetto principale e le informazioni sui nomi dei file delle risorse vengono perse dopo aver letto ...: (

Grazie in anticipo per il vostro aiuto.

+1

C'è una spiegazione molto approfondita su come applicare un'app per iOS qui: http://stackoverflow.com/questions/8919334/how-to-create-multiple-themes-skins-for-iphone-apps?rq= 1 Spiega anche come scuoiare un pennino, esp. da iOS 5. –

+1

Puoi dare un'occhiata alla libreria sottostante https://github.com/charithnidarsha/MultiThemeManager –

risposta

4

non sono sicuro circa le migliori pratiche .. Ma, se la vostra applicazione non è abbastanza grande, poi un plist ben strutturato è la vostra amico.

Inizialmente, è possibile scegliere: Metal Theme. È necessario tenere presente quanto segue:

Si dispone di un Singleton ThemeManager oppure è sufficiente inserire uno NSDictionary in uno dei propri Singletons, se appropriato.

Il punto dietro la ThemeManager è il mapping tra il bene e il tema ..

Alcuni codice di esempio (scritto direttamente sul SOF .. Non importa errori di sintassi):

#define kThemeMap(__x__) [[ThemeManager sharedManager] assetForCurrentTheme:__x__] 

... 

-(void)doUselessStuff { 
    UIImage* backgroundImage = [UIImage imageNamed:kThemeMap(@"FirstViewBG")]; 

    ... 

} 

//in the ThemeManager: 
//returns the appropriate name of the asset based on current theme 
-(NSString*)assetForCurrentTheme:(NSString*)asset { 
    //_currentTheme is an NSDictionary initialized from a plist. Plist can be downloaded, too. 
    NSString* newAsset = [_currentTheme objectForKey:asset]; 
    if(newAsset == nil) { 
     newAsset = [_defaultTheme objectForKey:asset]; 
    } 
    return asset; 
} 

//Let us assume the user selects Metal Theme somewhere .. Still coding ThemeManager: 
-(void)selectedNewTheme:(NSString*)newTheme { 
    //First, get the full path of the resource .. Either The main bundle, or documents directory or elsewhere.. 
    NSString* fullPath = ...; 
    self.currentTheme = [NSDictionary dictionaryWithContentsOfFile:fullPath]; 
} 

Il file plist sono solo un dizionario con stringa per la mappatura stringa ... qualcosa di simile:

//Default.plist 
@"FirstViewBG" : @"FirstViewBG_Default.png" 
@"SecondViewBG" : @"SecondViewBG_Default.png" 
@"WinSound"  : @"WinSound_Default.aiff" 

//Metal.plist 
@"FirstViewBG" : @"FirstViewBG_Metal.png" 
@"SecondViewBG" : @"SecondViewBG_Metal.png" 
@"WinSound"  : @"WinSound_Metal.aiff" 

in alternativa, si può solo salvare il postfix, se questo è abbastanza buono per yo u .. Ma, richiederà la manipolazione delle stringhe, tagliando l'estensione -> aggiungendo il suffisso -> aggiungendo l'estensione ..

O forse ne fa un prefisso?

+0

Grazie mille per la tua risposta e il codice molto descrittivo! Questa potrebbe essere una possibile soluzione. :) – Taka

+0

L'unico motivo per cui ho esitato a seguire questo approccio è che in questo modo devo conservare informazioni ridondanti sul nome del file di risorse sia nel file Nib che in Plist. Non mi costerebbe molto però ... spero ancora che ci sia un modo per leggere i nomi dei file delle risorse durante il caricamento del pennino e aggiungere il postfix o il prefisso specifico del tema al nome file nel processo ... idea? Se non è facile o non è possibile, prenderò questo approccio. Grazie. ;) – Taka

+0

aah .. Non riesco davvero a pensare a un modo per farlo. È necessario collegarli come IBOutlet e personalizzarli in viewDidLoad;) – Mazyod

0

È possibile categoria su UIImmagine con l'immagine methoredNamed :, utilizzare l'immagine personalizzata Nome: anziché quella predefinita. Nella metrica personalizzata, ha selezionato l'immagine per tema.

+0

Grazie per la tua risposta. Bene, funzionerà, ma credo che non sia una buona pratica usare la Categoria Objective-C per sovrascrivere un metodo. (Come discusso in http://stackoverflow.com/questions/5272451/overriding-methods-using-categories-in-objective-c) In tal caso, possiamo sottoclasse UIImage per sovrascrivere imageNamed :, ma in questo modo non possiamo usare Interface Costruttore in modo efficace. – Taka

Problemi correlati