2011-01-26 10 views
12

¿Tiene CoreText alguna posibilidad de seleccionar una variante de SmallCaps de una fuente, o de sintetizar pequeñas letras mayúsculas si la fuente no tiene esa característica? No puedo encontrar nada en la documentación de CoreText que trate sobre pequeñas letras mayúsculas, aunque hay instalaciones para tratar con las variaciones/características de las fuentes. ¿Alguien ha hecho algo similar a esto?¿CoreText es compatible con Small Caps?

Respuesta

6

En general es más fácil de usar CTFontDescriptorCreateCopyWithFeature. Como mencionó en su propia respuesta, esto solo funcionará para las fuentes que realmente implementen la función que está solicitando.

+0

En mi caso, también tengo que admitir opcionalmente cursiva/negrita, por lo que necesito usar la versión más genérica de atributos. Pero tiene razón, para un simple encendido/apagado de letras mayúsculas, 'CTFontDescriptorCreateCopyWithFeature' es un poco más fácil de usar. –

10

La respuesta parece ser un Sí calificado. Admite fuentes que tienen una función de mayúsculas pequeñas, pero no admite la sintetización de mayúsculas pequeñas en fuentes que no tienen la función. Esta característica se puede habilitar creando un CTFontDescriptor con el atributo kCTFontFeatureSettingsAttribute, que se asigna a una matriz de dictados de características. La clave kCTFontFeatureTypeIdentifierKey se debe establecer en 3 para Letter Case, y kCTFontFeatureSelectorIdentifierKey se debe establecer en 3 para Small Caps. <ATS/SFNTLayoutTypes.h> contiene constantes que identifican los diversos valores, aunque este encabezado no está disponible en el SDK de iOS.

de las fuentes disponibles en el IPAD, el siguiente soporte Small Caps:

  • Hoefler Text-Regular
  • Hoefler Text-itálico
  • Hoefler Text-Negro
  • Hoefler Text-BlackItalic
  • Didot

Nota, las cursiva/negrita fo Las personas de la familia Didot no son compatibles con las letras mayúsculas.

+0

Creo que esta cabecera está ahora disponible en el iOS 5 SDK –

2

Para extender la respuesta de Kevin Ballard. Los valores '3' y '3' funcionan para las fuentes del sistema, pero no parecen ser universales. Estoy usando una fuente externa y estos valores no funcionaron.

Puede desconectarse todas las propiedades disponibles con algo como esto:

UIFont *font = [UIFont fontWithName: fontName size: fontSize]; 
CFArrayRef fontProperties = CTFontCopyFeatures ((__bridge CTFontRef) font) ; 
NSLog(@"properties = %@", fontProperties); 
CFRelease(fontProperties); 

y determinar qué función de la fuente y el selector que necesita para permitir que las pequeñas tapas u otras características de la fuente.

5

Decidí responder aquí para proporcionar una solución más completa a cualquiera que intente solucionar este problema, ya que la información aquí es incompleta.

Esta solución utiliza el iOS 7 UIFontDescriptor como estoy ahora el abandono del soporte para iOS 6.

Como Anthony Mattox señaló, los valores de fuentes del sistema (que se enumeran como 3 y 3, pero debe tenerse en cuenta que en realidad kLetterCaseType y kSmallCapsSelector, no debe referirse a una enumeración por su número), no funcionará para fuentes personalizadas. No estoy seguro de si este es el caso para todas las fuentes personalizadas o solo algunas, pero descubrí que este es el caso del mío.

Cuando la excavación en la declaración de estos dos valores de enumeración, en realidad se puede ver que están en desuso y, presumiblemente, de todos modos sólo el trabajo de las pocas fuentes del sistema que soportan las pequeñas tapas. Después de registrar los atributos disponibles para mi fuente personalizada tal como lo describe Anthony, encontré los 2 atributos correctos para usar con las fuentes personalizadas. Son kLowerCaseType y kLowerCaseSmallCapsSelector. Creo que esta combinación es la única otra opción, por lo que para cualquier fuente que intente utilizar, será una u otra.

escribí algunos métodos categoría para encapsular esta funcionalidad para ambos casos:

- (UIFont *) smallCapSystemFont 
{ 
    UIFontDescriptor *descriptor = [self fontDescriptor]; 
    NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLetterCaseType), 
         UIFontFeatureSelectorIdentifierKey : @(kSmallCapsSelector)}]; 
    descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}]; 
    return [UIFont fontWithDescriptor:descriptor size:0]; 
} 

- (UIFont *) smallCapCustomFont 
{ 
    UIFontDescriptor *descriptor = [self fontDescriptor]; 
    NSArray *array = @[@{UIFontFeatureTypeIdentifierKey : @(kLowerCaseType), 
         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseSmallCapsSelector)}]; 
    descriptor = [descriptor fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : array}]; 
    return [UIFont fontWithDescriptor:descriptor size:0]; 
} 

Se utiliza éstos mediante la creación de un tipo de letra con el nombre y el tamaño correcto y luego llamando a uno de estos métodos en él que devolverá una versión de tapa pequeña de esa fuente. Tendrá que descubrir el método correcto para usar para cualquier fuente de letra pequeña que decida usar.

Probablemente haya una forma ingeniosa de averiguar cuál usar programáticamente en tiempo de ejecución comprobando los tipos disponibles (incluso analizando los resultados de ese conjunto de propiedades de fuente), pero no me he molestado en hacerlo porque estoy solo usar algunas fuentes diferentes y una verificación manual es adecuado para mí.

Editar:

Una cosa que he notado es que los números se manejan por separado. Si desea que los números también tengan un límite mínimo (lo que en realidad se llama "números de estilo antiguo" en el caso de la mayoría de las fuentes que lo admiten), lo necesitará explícitamente como un atributo.

parece que es la misma para ambas fuentes del sistema de apoyo y fuentes personalizadas, a diferencia de las letras.

usted acaba de añadir este diccionario para cada una de las matrices anteriores:

@{UIFontFeatureTypeIdentifierKey : @(kNumberCaseType), 
         UIFontFeatureSelectorIdentifierKey : @(kLowerCaseNumbersSelector)} 

Una vez más, para que esto funcione la fuente misma realidad tiene que apoyar este atributo.

+0

Este método no funciona para la fuente del sistema iOS 7 (Helvetica Neue). – Legoless

+0

@Legoless Para aclarar, no funcionará para Helvetica Neue porque esa fuente no viene con un modo de letras pequeñas. Esto solo funcionará para las fuentes que lo hayan horneado. Hay una lista de estas fuentes en otra respuesta a esta pregunta. Un ejemplo de una fuente de sistema con la que trabajará es "Didot". Pruebe 'smallCapsSystemFont' con ese y lo verá en acción. – Dima

+0

Si quiere usar letras pequeñas con Helvetica Neue, necesitará encontrar una versión de la fuente que otro construyó o fingir dibujando caracteres en mayúsculas de menor tamaño. – Dima

0

Como aquí nadie ha proporcionado una muestra de Swift 4, sólo voy a incluir el código de zona de juegos para mostrar algún pequeño texto tapas en un UILabel:

//: Playground - noun: a place where people can play  
import UIKit 
import CoreGraphics 

let pointSize : CGFloat = 24 
let fontDescriptor = UIFont(name: "HoeflerText-Regular", size: pointSize)!.fontDescriptor 



let fractionFontDesc = fontDescriptor.addingAttributes(
    [ 
     UIFontDescriptor.AttributeName.featureSettings: [ 
      [ 
       UIFontDescriptor.FeatureKey.featureIdentifier: kLetterCaseType, 
       UIFontDescriptor.FeatureKey.typeIdentifier: kSmallCapsSelector 
      ] 
     ] 
    ]) 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 500, height: 100)) 

label.font = UIFont(descriptor: fractionFontDesc, size:pointSize) 
label.text = "Montpelier, Vermont"