2013-09-12 7 views
9

Wir entwickeln eine App für iOS7 und unser Designer möchte nicht standardmäßige Schriftart (Avenir) verwenden, aber ich möchte nicht verlieren Dynamic Type-Funktionalität. Wie ich es verstehe Dynamischer Typ kann nur mit Standard-Systemschriftarten verwendet werden, die Helvetica Neue sind. Ist es möglich, andere Schriftarten zu verwenden oder ist dies momentan nicht möglich?iOS7: Können wir andere Schriftarten als Helvetica Neue mit Dynamic Type verwenden?

+0

iOS7 ist immer noch übereinstimmen, könnte dies bedeuten, dass niemand Ihre Frage beantworten. – rckoenes

+0

Entschuldigung, ich dachte, dass mit goldenen Master-DNA ist schon für iOS7 vorbei :) – tadasz

+0

Nein ist es nicht, es ist sogar in der gelben Nachricht über dem GM angegeben. – rckoenes

Antwort

15

Soweit ich verstanden [UIFont preferredFontForTextStyle:] gibt eine Schriftart mit fester Größe für eine bestimmte Schriftart Stil unabhängig von der Textansicht Standardgröße. Ich erwarte, dass die Änderung der Textgröße in den Einstellungen die Textgröße in meiner App um ein Delta ändert, anstatt einen festen Wert festzulegen. Wie in Text Programming Guide for iOS erwähnt,

Die eigentliche Schriftart für den von einem Textstil beschriebenen Zweck verwendet wird, kann auf eine Reihe von dynamischen Überlegungen variieren, einschließlich der Inhaltsgröße Kategorie Präferenz des Nutzers, die durch die UIApplication Eigenschaft preferredContentSizeCategory vertreten ist.

Ich bemerkte, dass die Eigenschaft preferredContentSizeCategory als Reaktion auf die Einstellung der Textgröße in den Einstellungen ändert.

Es ist auch wichtig, die UIContentSizeCategoryDidChangeNotification zu beachten, damit Sie den Text neu anordnen können, wenn der Benutzer die Inhaltsgrößenkategorie ändert. Wenn Ihre App diese Benachrichtigung erhält, sollte sie die Nachricht invalidateIntrinsicContentSize an Ansichten senden, die von Auto Layout positioniert wurden, oder setNeedsLayout an manuell positionierte Benutzeroberflächenelemente senden. Und es sollte bevorzugte Zeichensätze oder Schriftartdeskriptoren ungültig machen und nach Bedarf neue erwerben.

So ist meine Idee entsprechende Benachrichtigung zu beobachten, berechnet Delta Größe basierend auf preferredContentSizeCategory Eigenschaft und gilt Delta Standardschriftgröße der Text-Ansicht (die in IB oder programmatisch festgelegt wurden).


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 

I String Unterstützung zugeschrieben zugegeben, Demo auf GitHub

0

Beispiel mit benutzerdefinierter Schriftart.

https://github.com/jszumski/dynamic-type

Siehe @implementation UIFont (AvenirContentSize)

dafür, wie eine Schriftart anpassen die Standardgrößen unter NDA

Verwandte Themen