2011-10-29 17 views
7

私は自分のiPhoneアプリをスキン(またはデザインテーマ、または木製、金属、アースカラー、男性、女の子などのルックアンドフィール)に切り替えることができるようにしたいと考えています。iOSアプリでスキン(またはテーマをデザイン)を切り替えるにはどうすればよいですか?

ボタンと背景、サウンド、テキストの色の画像を含むスキンセットをいくつか準備し、アプリケーション設定で使用するスキンセットをユーザーに決定させます。

これを実装するベストプラクティスは何ですか?

条件は以下のとおりです。

  • は私がiOSの3.1.3以降
  • 私はスキンのセットは、インターネットからダウンロードしたいをサポートする必要がInterface Builderの
  • を使用したいです(私はアプリのすべてのスキンを束ねることはできません。スキンのセットがたくさんのイメージを必要とするため、アプリファイルのサイズが大きくなる可能性があります...特定のスキンについての情報をハードコードしたくない。)
  • カスタムスキンに1つまたはいくつかの要素が含まれていない場合(たとえば、画像o rサウンドファイル)、デフォルトのスキンセットの欠落要素を使用します。
  • 私は各スキンにNibファイルを作成したくありません。 1つの画面用のNibファイルはメインバンドル内の唯一のもので、メンテナンスが容易です。

私のアプリですべてのUIViewControllerのスーパークラスを作成し、Nibファイルをロードする部分をオーバーライドし、メインバンドルからロードする代わりに、保存されているスキンからリソースをロードすることを考えていますドキュメントディレクトリ...しかし、私はそれを行う方法がわかりません... Nibローディングメソッドのデフォルトの動作は、常にメインバンドルからリソースを読み込み、読み込んだ後にリソースファイル名に関する情報が失われます:あなたの助けを事前に(

感謝。

+1

ここにiOSアプリをスキンする方法については非常に詳細な説明があります:http://stackoverflow.com/questions/8919334/how-to-create-multiple-themes-skins-for-iphone-apps?rq= 1また、ペン先の塗装方法についても説明しています。 iOS 5から。 –

+1

下記のライブラリをご覧になれます。https://github.com/charithnidarsha/MultiThemeManager –

答えて

4

のベストプラクティスについてはよく分からないです..しかし、あなたのアプリが十分な大きさでない場合、うまく構造化plistのはあなたです友人。

最初に、あなたは次を選択できます:メタルテーマ。以下が成り立つ:

あなたはシングルトンThemeManagerを持っているか、適切な場合はシングルトンの1つにNSDictionaryをつけてください。

ThemeManagerの背後にあるポイントは、資産とテーマとの間のマッピング..です

いくつかのサンプルコード(SOFに直接書き込ま..構文ミスを気にしないでください):

#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]; 
} 

plistファイルは文字列へのマッピング文字列でちょうど辞書です...このような何か:

//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" 

またそれがヨーヨーのために十分に良好であれば、あなただけの、接尾辞を保存することができますしかし、それは文字列の操作を必要とするでしょう - 拡張をスライスして - >後置を加える - >拡張を追加する..

それとも接頭語にしますか?

+0

ありがとう、非常に説明的なコードです!これは可能な解決策である可能性があります。 :) – Taka

+0

この方法をとることを躊躇する理由は、このように、NibファイルとPlistの両方でリソースファイル名に関する冗長な情報を保持する必要があるということだけです。しかし、私はまだNibの読み込み中にリソースファイル名を読み込み、そのプロセスのファイル名にテーマ固有の接尾辞または接頭辞を追加する方法があることを期待しています。アイディア?それが容易ではない、または不可能であるなら、私はこのアプローチをとるでしょう。ありがとう。 ;) – Taka

+0

aah ..私は本当にそれを行う方法を考えることができません。あなたはIBOutletsとしてそれらをリンクし、viewDidLoadでカスタマイズする必要があります;) – Mazyod

0

メーリング画像でカテゴリをUIImageにすることができます。名前付き:、デフォルトのものではなくカスタムimageNamed:を使用します。 カスタムメードでは、テーマ別に画像を選択しました。

+0

あなたの返事をありがとう。さて、それは動作しますが、メソッドをオーバーライドするためにObjective-Cカテゴリを使用するのは良い方法ではないと思います。 (例:http://stackoverflow.com/questions/5272451/overriding-methods-using-categories-in-objective-c)この場合、UIImageをサブクラス化してimageNamed:をオーバーライドすることができますが、この方法ではInterfaceビルダーは効果的です。 – Taka

関連する問題