2013-09-12 14 views
9

Projektujemy aplikację na iOS7, a nasz projektant chce użyć innej niż domyślna czcionki (Avenir), ale nie chcę tracić funkcjonalności typu dynamicznego. Rozumiem, że Dynamic Type może być używany tylko z domyślną czcionką systemową, którą jest Helvetica Neue. Czy można używać innych czcionek lub w tej chwili nie jest to opcja?iOS7: Czy możemy używać czcionek innych niż Helvetica Neue z typem dynamicznym?

+0

iOS7 jest jeszcze w NDA, może to oznaczać, że nikt nie odpowie na twoje pytanie. – rckoenes

+0

Przepraszam, myślałem, że ze złotymi mistrzami DNA już się skończyło dla iOS7 :) – tadasz

+0

Nie, nie jest, jest nawet powiedziane w żółtym komunikacie nad GM. – rckoenes

Odpowiedz

15

Z tego co rozumiem, [UIFont preferredFontForTextStyle:] zwraca czcionkę o stałym rozmiarze dla określonego stylu czcionki, niezależnie od domyślnego rozmiaru widoku tekstowego. Oczekuję, że zmiana rozmiaru tekstu w Ustawieniach spowoduje zmianę rozmiarów tekstu w mojej aplikacji o pewną różnicę zamiast ustawiania wartości stałej. Jak zauważono w Text Programming Guide for iOS,

Rzeczywista czcionka używana do celów określonych przez styl tekstu może się różnić w zależności od szeregu dynamicznych rozważań, w tym treści preferencji kategorii wielkości użytkownika, który jest reprezentowany przez własności preferredContentSizeCategory UIApplication.

Zauważyłem, że zmiana właściwości preferredContentSizeCategory zmienia się w ustawieniu rozmiaru tekstu w Ustawieniach.

Ważne jest również przestrzeganie UIContentSizeCategoryDidChangeNotification, aby można było zmienić układ tekstu, gdy użytkownik zmieni kategorię wielkości treści. Gdy aplikacja otrzyma to powiadomienie, powinna wysłać wiadomość invalidateIntrinsicContentSize do widoków ustawionych przez Automatyczny układ lub wysłać setNeedsLayout do elementów interfejsu użytkownika ustawionych ręcznie. Powinno również unieważnić preferowane czcionki lub deskryptory czcionek, aw razie potrzeby zdobyć nowe.

Tak, mój pomysł jest, aby przestrzegać odpowiedniego powiadomienia, obliczyć wielkość delta na podstawie preferredContentSizeCategory własności i zastosowania delty do domyślnego rozmiaru czcionki tekstowego (który został ustawiony w IB lub programowo).


PreferredFontLabel.h

@interface PreferredFontLabel : UILabel 

@property (nonatomic) UIFontDescriptor *defaultFontDescriptor; 

@end 

PreferredFontLabel.m

#import "PreferredFontLabel.h" 
#import "UIApplication+ContentSize.h" 

@implementation PreferredFontLabel 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [self setup]; 
    } 
    return self; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self setup]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self setup]; 
    } 
    return self; 
} 

- (void)setup 
{ 
    self.defaultFontDescriptor = self.font.fontDescriptor; 

    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(contentSizeCategoryDidChange) 
    name:UIContentSizeCategoryDidChangeNotification 
    object:nil]; 

    [self contentSizeCategoryDidChange]; 
} 

- (void)setDefaultFontDescriptor:(UIFontDescriptor *)defaultFontDescriptor 
{ 
    _defaultFontDescriptor = defaultFontDescriptor; 

    [self contentSizeCategoryDidChange]; 
} 

- (void)contentSizeCategoryDidChange 
{ 
    CGFloat preferredSize = [self.defaultFontDescriptor.fontAttributes[UIFontDescriptorSizeAttribute] floatValue]; 
    preferredSize += [UIApplication sharedApplication].contentSizeDelta; 

    self.font = [UIFont fontWithDescriptor:self.defaultFontDescriptor size:preferredSize]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil]; 
} 

@end 

UIApplication + ContentSize.h

@interface UIApplication (ContentSize) 

@property (nonatomic, readonly) NSInteger contentSizeDelta; 

@end 

UIApplication + ContentSize.m

#import "UIApplication+ContentSize.h" 

@implementation UIApplication (ContentSize) 

- (NSInteger)contentSizeDelta 
{ 
    static NSArray *contentSizeCategories; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     contentSizeCategories = @[UIContentSizeCategoryExtraSmall, 
            UIContentSizeCategorySmall, 
            UIContentSizeCategoryMedium, 
            UIContentSizeCategoryLarge, 
            UIContentSizeCategoryExtraLarge, 
            UIContentSizeCategoryExtraExtraLarge, 
            UIContentSizeCategoryExtraExtraExtraLarge 
            UIContentSizeCategoryAccessibilityMedium, 
            UIContentSizeCategoryAccessibilityLarge, 
            UIContentSizeCategoryAccessibilityExtraLarge, 
            UIContentSizeCategoryAccessibilityExtraExtraLarge, 
            UIContentSizeCategoryAccessibilityExtraExtraExtraLarge]; 
    }); 

    // assume UIContentSizeCategoryLarge is default category 
    NSInteger contentSizeDelta = [contentSizeCategories indexOfObject:self.preferredContentSizeCategory]; 

    if(contentSizeDelta != NSNotFound) { 
     contentSizeDelta -= [contentSizeCategories indexOfObject:UIContentSizeCategoryLarge]; 

     return contentSizeDelta; 
    } else { 
     return 0; 
    } 
} 

@end 

Dodałem wsparcie przypisać ciąg demo jest dostępna na GitHub

Powiązane problemy