2012-04-18 3 views
0

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

ответ

3

Я хотел бы сделать категорию, чтобы скрыть сложность - вы могли бы начать с чем-то вроде этого

.h

// NSUserDefaults+CustomFontAdditions.h 

@interface NSUserDefaults (CustomFontAdditions) 

- (UIFont *)ps_fontForKey:(NSString *)fontKey; 
- (void)ps_setFont:(UIFont *)font forKey:(NSString *)fontKey; 

@end 

.m

// NSUserDefaults+CustomFontAdditions.m 

#import "NSUserDefaults+CustomFontAdditions.h" 

NSString * const PSCustomFontsKey  = @"PSCustomFontsKey"; 
NSString * const PSCustomFontKeyFontName = @"PSCustomFontKeyFontName"; 
NSString * const PSCustomFontKeyFontSize = @"PSCustomFontKeyFontSize"; 

@implementation NSUserDefaults (CustomFontAdditions) 

- (UIFont *)ps_fontForKey:(NSString *)fontKey; 
{ 
    NSDictionary *fonts = [self dictionaryForKey:PSCustomFontsKey]; 

    UIFont *font = nil; 

    if (fonts) { 
     NSDictionary *fontComponents = [fonts valueForKey:fontKey]; 

     NSString *fontName = [fontComponents valueForKey:PSCustomFontKeyFontName]; 
     CGFloat size  = [[fontComponents valueForKey:PSCustomFontKeyFontSize] floatValue]; 

     font = [UIFont fontWithName:fontName size:size]; 
    } 

    return font; 
} 

- (void)ps_setFont:(UIFont *)font forKey:(NSString *)fontKey; 
{ 
    NSMutableDictionary *fonts = [[self dictionaryForKey:PSCustomFontsKey] mutableCopy]; 

    if (!fonts) { 
     fonts = [[NSMutableDictionary alloc] initWithCapacity:1]; 
    } 

    NSDictionary *fontComponents = [[NSDictionary alloc] initWithObjectsAndKeys: 
            font.fontName, PSCustomFontKeyFontName, 
            [NSNumber numberWithFloat:font.pointSize], PSCustomFontKeyFontSize, nil]; 

    [fonts setValue:fontComponents forKey:fontKey]; 

    [self setObject:fonts forKey:PSCustomFontsKey]; 
} 

@end 

Использование будет выглядеть

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
[standardUserDefaults ps_setFont:[UIFont systemFontOfSize:12.0f] forKey:@"font1"]; 
[standardUserDefaults ps_setFont:[UIFont fontWithName:@"Helvetica Neue" size:24.0f] forKey:@"font2"]; 
[standardUserDefaults synchronize]; 

NSLog(@"%@", [standardUserDefaults ps_fontForKey:@"font1"]); 
NSLog(@"%@", [standardUserDefaults ps_fontForKey:@"font2"]); 

Выходы:

#=> 2012-04-19 00:01:21.756 ma[1340:f803] <UICFFont: 0x68a18b0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 12px 
#=> 2012-04-19 00:01:21.765 ma[1340:f803] <UICFFont: 0x6b99670> font-family: "Helvetica Neue"; font-weight: normal; font-style: normal; font-size: 24px 
+0

Спасибо, Пол ... Я реализовал ваше решение, и оно работает как шарм. оцените подробный пример кода – 239revilo

2

Эти элементы, которые могут быть сохранены в NSUserDefaults:

NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary

Вы могли бы сделать что-то вроде этого:

NSDictionary *fontInformation = [NSDictionary dictionaryWithObjectsAndKeys: 
@"YOUR_FONTS_NAME", "fontName", 
[NSNumber numberWithInt:14], @"fontSize", nil]; 

[[NSUserDefaults standardUserDefaults] setObject:fontInformation forKey:@"fontInfo"]; 

Затем вы можете захватить NSDictionary из NSUserDefaults и повторно создать UIFont.

Смежные вопросы