¿Podemos establecer el peso de fuente o el estilo de fuente de NSFont directamente, en lugar de cambiar el nombre de la fuente?

La pregunta por adelantado:

¿Podemos acceder directamente a la información de tipo de fuente y peso para una cadena atribuida? ¿O podemos crear una cadena nueva para la que podamos establecer esta información?

La explicación:

En iOS 6, puede alternar una selección como negrita o cursiva. Pero la forma en que esto funciona es desconcertante: no cambia el NSFontAttributeName que Apple nos ha expuesto (cambiando el nombre de fuente, por ejemplo, "HelveticaNeue" a "HelveticaNeue-Bold"). En cambio, conserva la familia de fonts como "Helvetica Neue" y cambia el "font-weight" a negrita en la cadena de estilo. Si tuviera que pedir una instancia de text atribuido para su descripción, verá algo como esto por su información de fuente:

NSFont = "<UICFFont: 0x1fbc53a0> font-family: \"Helvetica Neue\"; font-weight: bold; font-style: normal; font-size: 16px"; 

Esto crea un problema. No podemos cambiar la fuente mientras se conserva la información de estilo en negrita y cursiva. Si salta a través de los aros de escanear la antigua cadena atribuida para get información de estilo, crear una nueva cadena con una nueva fuente y, a continuación, cambiar el nombre del atributo de la fuente (utilizando, por ejemplo, "Courier-Bold" para cualquier lugar que desee que sea negrita), crea un nuevo problema: si intenta cambiar la fuente a la normalidad (no en negrita), tendrá un nombre de fuente como "Courier-Bold" Y un peso de fuente de "negrita", porque la información de estilo aún no estaba en negrita. Y alternar, por supuesto, no cambiará el nombre de la fuente. Entonces básicamente has creado una fuente que ya no se puede cambiar cuando el usuario alterna el text seleccionado. El usuario presionará el button "negrita" en el menu contextual, pero no hará nada, porque la negrita ahora ha sido codificada en el nombre de la fuente, podría decir.

Si va a la otra ruta e intenta anular "toggleBoldface" y "toggleItalic" en su UITextView, no parece posible prevenir realmente que se cambie la información de estilo en la cadena de estilo. No parece, al parecer, cambiar el nombre de la fuente solo durante el evento de alternar.

Entonces, una vez más, la pregunta: ¿podemos acceder directamente a la información de tipo de fuente y peso directamente de alguna manera? ¿O podemos crear una cadena nueva para la que podamos establecer esta información? Esto resolvería el problema de tratar de cambiar de una fuente a otra y preservar la información de estilo.

Y una doble aclaración:

Estamos hablando de iOS. Cuando configura el atributo de fuente de una cadena atribuida (NSFontAttributeName) para algún range de caracteres, internamente iOS crea un NSFont con una cadena de estilo. La cadena de estilo leerá "font-weight: normal; font-style: normal" si usted mismo ha configurado un atributo de fuente. Pero esta cadena de estilo es donde se almacena la información en negrita y cursiva establecida en una UITextView (por alternancia).

    Parece que podría crear un nuevo CTFontRef utilizando un CTFontAttributesRef donde haya establecido el valor para las keys de atributo kCTFontWeightTrait y / o kCTFontSymbolicTrait . ¿Eso ayuda?

    cf. CTFontDescriptorReference y CTFontReference

    EDITAR

    Supongo que esto no funcionará, lo miré más a mí mismo … dejando esto aquí en caso de que alguien más tenga la misma idea.