Как переключать скины (или темы оформления) в приложении для iOS? - PullRequest
7 голосов
/ 29 октября 2011

Я бы хотел, чтобы мое приложение для iPhone могло переключаться между скинами (или темой дизайна, или внешним видом, таким как дерево, металл, цвет земли, мужчины, девушки и т. Д.).

Я подготовлю несколько наборов скинов, содержащих изображения для кнопок и фона, звуков и цвета текста, и предоставлю пользователю возможность выбрать, какой набор скинов он хочет использовать в настройках приложения.

Как лучше всего это реализовать?

Условия:

  • Я хотел бы использовать Interface Builder
  • Мне нужно поддерживать iOS 3.1.3и позже
  • Я хочу сделать наборы скинов загружаемыми из Интернета (я не могу связать все скины в приложении, так как один набор скинов требует много изображений, и размер файла приложения может стать огромнымесли я это сделаю ... Я также не хочу жестко кодировать какую-либо информацию о конкретных скинах.)
  • Если пользовательский скин не содержит один или несколько элементов (например, изображение или звуковой файл),Я хочу использовать отсутствующий элемент из определенияault set skin.
  • Я не хочу создавать Nib-файлы для каждого скина.Файл Nib для одного экрана должен быть единственным в основном комплекте для упрощения обслуживания.

Я думаю о создании суперкласса всех контроллеров UIViewController в моем приложении и переопределении загружаемой частиNib-файл и вместо загрузки из основного комплекта загружайте ресурсы из скина, сохраненного в каталоге Document ... но я не знаю, как это сделать ... Поведение по умолчанию для методов Nib-загрузкивсегда загружает ресурсы из основного комплекта, а информация об именах файлов ресурсов теряется после прочтения ...: (

Заранее благодарим за помощь.

Ответы [ 2 ]

4 голосов
/ 29 октября 2011

Не уверен насчет наилучшей практики. Но, если ваше приложение недостаточно велико, то ваш друг хорошо структурированный список.

Изначально вы могли выбрать: Metal Theme. Следующее должно иметь место:

У вас либо Синглтон ThemeManager, либо просто прикрепите 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 голосов
/ 19 марта 2013

Вы можете создавать категории в UIImage с помощью изображения с методами imageNamed:, использовать нестандартное изображение imageNamed: вместо значения по умолчанию.В пользовательском меторде выбрано изображение по теме.

...