Desidero supportare i sistemi iOS 8 e iOS 9 per la mia app. E forse iOS 7. Come sappiamo, il font di sistema per iOS 7 e 8 è Helvetica Neue. Ma in iOS 9 il font di sistema è San Francisco. E se non imposti esplicitamente il carattere Helvetica tramite [UIFont fontWithName:@"HelveticaNeue" size:15];
, ma usi [UIFont systemFontOfSize:15];
, otterrai automaticamente Helvetica per iOS 7 e 8 e San Francisco per iOS 9. Ed è fantastico! Per le etichette ei pulsanti del generatore di interfaccia è possibile impostare caratteri di sistema sottili, ultrasottili, medi ecc. È anche fantastico. Ma come posso impostare questi sottili, ultra, medi caratteri di sistema nel codice, programmaticamente? Devo creare una categoria con un fork per iOS 9 e iOS precedenti?Font di sistema per iOS 8 e iOS 9
risposta
Utilizzare + systemFontOfSize:weight:
. È disponibile per iOS 8 e versioni successive.
Per iOS 7, le impostazioni del generatore di interfaccia funzioneranno e per il codice sarà necessario creare un UIFontDescriptor
con il peso appropriato.
Grazie a @Leo Natan. Ma voglio mostrare uno snippet di codice per gli appassionati di copia-incolla.
UIFont* systemFont = [UIFont respondsToSelector:@selector(systemFontOfSize:weight:)] ? [UIFont systemFontOfSize:25 weight:UIFontWeightThin] : [UIFont fontWithName:@"HelveticaNeue-Thin" size:25];
È meglio testare per funzionalità specifiche, piuttosto che per la versione del sistema operativo. Usa '[UIFont respondsToSelector: @selector (systemFontOfSize: weight :)]' per verificare la disponibilità. –
@LeoNatan Hai ragione! Ovviamente –
Ho creato questa estensione:
import Foundation
import UIKit
enum SystemFontWeight : String {
case UltraLight = "HelveticaNeue-UltraLight"
case Thin = "HelveticaNeue-Thin"
case Light = "HelveticaNeue-Light"
case Regular = "HelveticaNeue"
case Medium = "HelveticaNeue-Medium"
case Semibold = "Helvetica-Bold"
case Bold = "HelveticaNeue-Bold"
case Heavy = "HelveticaNeue-CondensedBold"
case Black = "HelveticaNeue-CondensedBlack"
var weightValue:CGFloat? {
if #available(iOS 8.2, *) {
switch self {
case .UltraLight:
return UIFontWeightUltraLight
case .Thin:
return UIFontWeightThin
case .Light:
return UIFontWeightLight
case .Regular:
return UIFontWeightRegular
case .Medium:
return UIFontWeightMedium
case .Semibold:
return UIFontWeightSemibold
case .Bold:
return UIFontWeightBold
case .Heavy:
return UIFontWeightHeavy
case .Black:
return UIFontWeightBlack
}
} else {
return nil
}
}
}
extension UIFont {
static func systemFontOfSize(fontSize:CGFloat, weight:SystemFontWeight) -> UIFont {
if #available(iOS 8.2, *) {
return UIFont.systemFontOfSize(fontSize, weight: weight.weightValue!)
} else {
// Fallback on earlier versions
return UIFont(name: weight.rawValue, size: fontSize)!
}
}
}
che rende possibile l'applicazione dei caratteri in questo modo:
myLabel.font = UIFont.systemFontOfSize(14, weight: .Medium)
Questo imposterà automaticamente il tipo di carattere corretto per sia per iOS 8 e iOS 9.
Grazie a @Antoine per aver inviato un'ottima risposta per swift. Segue l'Obiettivo C Un tipo simile di risposta se qualcuno vuole. Implementare categoria per UIFont
UIFont + Cat.m
#import "UIFont+Cat.h"
@implementation UIFont (Cat)
+ (UIFont *)systemFontWithSize:(CGFloat)fontSize weight:(CGFloat)weight {
if ([UIFont respondsToSelector:@selector(systemFontOfSize:weight:)]) {
return [UIFont systemFontOfSize:fontSize weight:weight];
}
NSString *fontName = @"HelveticaNeue";
if (weight == UIFontWeightUltraLight) {
fontName = @"HelveticaNeue-UltraLight";
}
else if (weight == UIFontWeightThin) {
fontName = @"HelveticaNeue-Thin";
}
else if (weight == UIFontWeightLight) {
fontName = @"HelveticaNeue-Light";
}
else if (weight == UIFontWeightRegular) {
fontName = @"HelveticaNeue";
}
else if (weight == UIFontWeightMedium) {
fontName = @"HelveticaNeue-Medium";
}
else if (weight == UIFontWeightSemibold) {
fontName = @"Helvetica-Bold";
}
else if (weight == UIFontWeightBold) {
fontName = @"HelveticaNeue-Bold";
}
else if (weight == UIFontWeightHeavy) {
fontName = @"HelveticaNeue-CondensedBold";
}
else if (weight == UIFontWeightBlack) {
fontName = @"HelveticaNeue-CondensedBlack";
}
return [UIFont fontWithName:fontName size:fontSize];
}
@end
'+ systemFontOfSize: peso:' Disponibile in iOS 8.2 e versioni successive. –
@ValentinShamardin Non ti preoccupare, il metodo era lì da iOS 8. È stato appena esposto come API pubblica in 8.2, ma puoi usarlo. –