¿CoreText admite Small Caps?

¿CoreText tiene alguna facilidad para seleccionar una variante SmallCaps de una fuente o para sintetizar casquillos pequeños si la fuente no tiene esa característica? No puedo encontrar nada en la documentation de CoreText que habla de tapas pequeñas, aunque hay facilidades para tratar las variaciones / características de la fuente. ¿Alguien ha hecho algo similar a esto?

En general, es más fácil utilizar CTFontDescriptorCreateCopyWithFeature . Como mencionaste en tu propia respuesta, esto solo funcionará para las fonts que realmente implementan la function que estás solicitando.

La respuesta parece ser un Sí calificado. Es compatible con fonts que tienen una function Small Caps, pero no admite sintetizar Small Caps en fonts que no tienen la function. Esta function se puede habilitar creando un CTFontDescriptor con el atributo kCTFontFeatureSettingsAttribute , que se asigna a una matriz de dicciones de características. La key kCTFontFeatureTypeIdentifierKey debe establecerse en 3 para Letter Case y la kCTFontFeatureSelectorIdentifierKey debe establecerse en 3 para Small Caps. <ATS/SFNTLayoutTypes.h> contiene constantes que identifican los diversos valores, aunque este encabezado no está disponible en iOS SDK.

De las fonts disponibles en el iPad, el siguiente soporte Small Caps:

  • HoeflerText-Regular
  • HoeflerText-Italic
  • HoeflerText-Black
  • HoeflerText-BlackItalic
  • Didot

Tenga en count que las fonts Italic / Bold en la familia Didot no son compatibles con casquillos pequeños.

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

Esta solución utiliza iOS 7 UIFontDescriptor ya que ahora estoy dejando caer soporte para iOS 6.

Como lo señaló Anthony Mattox, los valores de las fonts del sistema (que se enumeran como 3 y 3, pero deben indicarse que son realmente kLetterCaseType y kSmallCapsSelector , no debe hacer reference a una enumeración por su número), no funcionará para las fonts personalizadas. No estoy seguro de si este es el caso de todas las fonts personalizadas o solo algunas, pero encontré que este es el caso con las mías.

Al cavar en la statement de estos dos valores de enumeración, en realidad puede ver que están en desuso de todos modos y, presumiblemente, solo funcionan para las pocas fonts de sistema que admiten casquillos pequeños. Después de registrar los attributes disponibles para mi fuente personalizada según lo descrito por Anthony, encontré los 2 attributes correctos para usar para las fonts personalizadas. Son kLowerCaseType y kLowerCaseSmallCapsSelector . Creo que esta combinación es la única otra opción, por lo que para cualquier fuente que intentes usar, será una u otra.

Escribí algunos methods de categoría para encapsular esta funcionalidad en 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]; } 

Utiliza esto creando una fuente con el nombre y el tamaño correctos y luego invocando uno de estos methods que devolverá una versión pequeña de esa fuente. Deberá averiguar el método correcto para usar para cualquier tipo de fuente de casquillos pequeños que decida usar.

Es probable que haya una manera inteligente de determinar cuál utilizar de forma programática en time de ejecución al verificar los types disponibles (incluso si solo se analizan los resultados de esa matriz de properties de fuente), pero no me he molestado en hacerlo, ya que solo utilizo unos pocos Diferentes fonts y una verificación manual son adecuadas para mí.

Editar:

Una cosa que noté es que los numbers se manejan por separado. Si desea que los numbers también tengan un pequeño límite (que en realidad parece que se denomina "Números de estilo antiguo" en el caso de la mayoría de las fonts que lo admiten), lo necesitará explícitamente como un atributo.

Parece que es lo mismo para las fonts de sistema de soporte y las fonts personalizadas, a diferencia de las letras.

Simplemente agregaría este dictionary a cada una de las matrices anteriores:

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

Una vez más, para que esto funcione, la fuente en sí necesita apoyar este atributo.

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

Puede cerrar todas las properties disponibles con algo como esto:

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

y determine qué function de fuente y selector necesitará para habilitar las tapas pequeñas u otras funciones de fuente.