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?
Odpowiedz
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
przykład niestandardowej czcionki.
https://github.com/jszumski/dynamic-type
Zobacz @implementation UIFont (AvenirContentSize)
dla jak dostosować czcionkę, aby dopasować rozmiary domyślne
- 1. usługi czcionki zastępcze dla Helvetica Neue
- 2. Używanie czcionek innych niż iPhone
- 3. Używanie aplikacji Helvetica Neue Light - aplikacja Html5 IOS
- 4. Czy możemy używać wyrażeń sprężystych (spel) w innych adnotacjach?
- 5. Czy powinienem używać czcionek typograficznych?
- 6. Czy możemy używać Foundation z kodem HTML5Boilerplate?
- 7. Czy możemy używać Highcharts z React-Native?
- 8. Omijanie @ deklaracji strony czcionki, która zastępuje rodzinę czcionek "helvetica"
- 9. Czy możemy wyeksportować wiele funkcji innych niż AMD z modułu w requirejs?
- 10. Jak mogę ujednolicić wysokość linii Helvetica Neue w różnych przeglądarkach (a nie pogrubioną czcionką)?
- 11. Czy możemy łączyć ze sobą 2 style czcionek w Javie?
- 12. Jak używać czcionek fontello?
- 13. Ograniczenia parametrów typu dla typów czcionek z typem * -> *
- 14. Czy możemy używać & w adresie URL?
- 15. Jak używać makra TRACE w projektach innych niż MFC?
- 16. Jak mogę używać WriteLn z typem wyliczenia?
- 17. Czy możemy używać jquery ui z twitter-bootstrap?
- 18. Problemy z programowaniem dynamicznym
- 19. Ukrywanie klas innych niż java z findbugs
- 20. Jak używać osadzonych czcionek do wywoływania Graphics2D.drawString (...) z iText (DefaultFontMapper?)
- 21. Czy możemy użyć Microsoft.AspNet.WebApi.Client z aplikacji ASP.NET Core?
- 22. Jak używać HAML w łączu dynamicznym?
- 23. Czy CocoaPod use_frameworks! pracować z iOS7?
- 24. Czy mogę używać programu ładującego Ext do dynamicznego ładowania skryptów/obiektów innych niż ext?
- 25. W jaki sposób możemy przetestować metody kontrolerów kątowych innych niż zakres?
- 26. Czy obiekt jest typem odniesienia lub typem wartości?
- 27. Dlaczego nazwy czcionek wymagają cytatów?
- 28. Czy mogę używać czcionek niesamowitych ikon na wiadomościach e-mail?
- 29. Programy innych niż Python w virtualenv
- 30. Czy powinniśmy śledzić wady w rzeczach innych niż kod?
iOS7 jest jeszcze w NDA, może to oznaczać, że nikt nie odpowie na twoje pytanie. – rckoenes
Przepraszam, myślałem, że ze złotymi mistrzami DNA już się skończyło dla iOS7 :) – tadasz
Nie, nie jest, jest nawet powiedziane w żółtym komunikacie nad GM. – rckoenes