2015-09-21 16 views
6

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

5

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.

+3

'+ systemFontOfSize: peso:' Disponibile in iOS 8.2 e versioni successive. –

+0

@ValentinShamardin Non ti preoccupare, il metodo era lì da iOS 8. È stato appena esposto come API pubblica in 8.2, ma puoi usarlo. –

2

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]; 
+1

È meglio testare per funzionalità specifiche, piuttosto che per la versione del sistema operativo. Usa '[UIFont respondsToSelector: @selector (systemFontOfSize: weight :)]' per verificare la disponibilità. –

+0

@LeoNatan Hai ragione! Ovviamente –

10

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.

0

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