ios nsattributedstring

ios - Centrar dos fuentes con diferentes tamaños diferentes verticalmente en un NSAttributedString



nsattributedstring swift 4 (4)

Aquí hay un ejemplo de trabajo para alinear verticalmente texto más pequeño usando NSBaselineOffsetAttributeName .

NSString *bigString = @"BIG"; NSString *smallString = @"Small String"; NSString *fullString = [NSString stringWithFormat:@"%@ %@", bigString, smallString]; NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:fullString]; NSRange bigStringRange = NSMakeRange(0, bigString.length); NSRange smallStringRange = NSMakeRange(bigStringRange.length, smallString.length); [string beginEditing]; //Set big string font and size [string addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:28.0] range:bigStringRange]; //set small string font and size [string addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:18.0] range:smallStringRange]; //Set small string baseline offset [string addAttribute:NSBaselineOffsetAttributeName value:[NSNumber numberWithFloat:3.0] //adjust this number till text appears to be centered range:smallStringRange]; [string endEditing];

Uso NSAttributedString para generar una cadena con dos tamaños diferentes. Por defecto, su alineación inferior se ve así:

Pero quiero centrarlo verticalmente, así:

Para que quede claro, esta es una única cadena atribuida, no dos o más. Este es un ejemplo simplificado para describir mi pregunta, lo que realmente me gustaría hacer es más complejo.


Una mejor solución es calcular NSBaselineOffsetAttributeName a partir de la tipografía de fuentes (artículo breve https://www.raizlabs.com/dev/2015/08/advanced-ios-typography/ )

Establecer atributo para la segunda parte de la cadena atribuida.

secondPartAttributes[NSBaselineOffsetAttributeName] = @((firstFont.xHeight - secondFont.xHeight)/2);


Yo diría que lo más fácil es manipular el atributo NSBaselineOffsetAttributeName para el texto en cuestión:

NSBaselineOffsetAttributeName

El valor de este atributo es un objeto NSNumber que contiene un valor de coma flotante que indica el desplazamiento del personaje desde la línea base, en puntos. El valor predeterminado es 0.

Para centrar, tomaría la diferencia entre la altura del texto grande y la altura del texto más pequeño y lo dividiría a la mitad, luego lo usaría como el ajuste de la línea base.


La respuesta de YasT en Swift:

Swift 3

let bigString = "BIG" let smallString = "Small String" let fullString = "/(bigString) /(smallString)" let string = NSMutableAttributedString(string: fullString) let bigStringRange = NSRange(location: 0, length: bigString.utf16.count) let smallStringRange = NSRange(location: bigStringRange.length, length: smallString.utf16.count) let bigStringFontSize: CGFloat = 28 let smallStringFontSize: CGFloat = 18 string.beginEditing() string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: bigStringFontSize), range: bigStringRange) string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: smallStringFontSize), range: smallStringRange) string.addAttribute(NSBaselineOffsetAttributeName, value: (bigStringFontSize - smallStringFontSize) / 2, range: smallStringRange) string.endEditing()

Swift 4

let bigString = "BIG" let smallString = "Small String" let fullString = "/(bigString) /(smallString)" let string = NSMutableAttributedString(string: fullString) let bigStringRange = NSRange(location: 0, length: bigString.count) let smallStringRange = NSRange(location: bigStringRange.length, length: smallString.count) let bigStringFontSize: CGFloat = 28 let smallStringFontSize: CGFloat = 18 string.beginEditing() string.addAttribute(.font, value: UIFont.systemFont(ofSize: bigStringFontSize), range: bigStringRange) string.addAttribute(.font, value: UIFont.systemFont(ofSize: smallStringFontSize), range: smallStringRange) string.addAttribute(.baselineOffset, value: (bigStringFontSize - smallStringFontSize) / 2, range: smallStringRange) string.endEditing()