2011-06-16 8 views
9

La cadena atribuida tiene solo un atributo: fuente Helvetica NeueUI de 17 puntos, que abarca toda la cadena. La línea 1 ~ 3 es puramente inglesa, la línea 4 ~ 6 son mezclas de inglés y chino, la línea 7 ~ 8 son puramente chinas.Espaciado entre líneas en el diseño de varios idiomas con Core Text

Luego se coloca con CTFramesetter y el marco resultante se dibuja con CTFrameDraw.

// UIView subclass 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.backgroundColor = [UIColor whiteColor]; 
     CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica NeueUI"), 17.f, NULL); 
     _text = [[NSAttributedString alloc] initWithString:string attributes: 
       [NSDictionary dictionaryWithObject:(id)font forKey:(id)kCTFontAttributeName]]; 
     CFRelease(font); 
     _framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)_text); 
     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPathAddRect(path, NULL, self.bounds); 
     _frame = CTFramesetterCreateFrame(_framesetter, CFRangeMake(0, 0), path, NULL); 
     CGPathRelease(path); 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    // Flip the coordinate system. 
    CGContextTranslateCTM(context, 0.f, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.f, -1.f); 

    CGContextSetTextMatrix(context, CGAffineTransformIdentity); 

    CTFrameDraw(_frame, context); 
    CGContextRestoreGState(context); 
} 

El problema es que el espacio entre la línea 7 y 8 (líneas puramente chinas) es mucho más pequeño que otros.

Por el contrario, pongo un UILabel debajo de él, con la misma fuente y texto. Ignorando la diferencia de representación de los caracteres individuales, puede ver que los espacios de línea en UILabel son uniformes, incluido el último entre dos líneas chinas.

Screenshot

Aviso: esto da como resultado anterior se puso en un dispositivo real. Si ejecuta el mismo código en el simulador, obtendrá resultados muy diferentes para la vista de texto principal: los espacios entre las líneas que contienen chino son mucho más grandes que otros.

  1. ¿Por qué el espacio entre líneas chinas es más pequeño (más grande)?
  2. ¿Cómo puedo diseñar texto en varios idiomas con una altura de línea uniforme usando Core Text?

PD: aquí está el sample project puede probarse usted mismo.

Respuesta

1

finalmente obtuvo una respuesta oficial del ingeniero de Apple:

métricas CTLine se basan en el máximo de cada uno de {ascenso, descenso, líder}; esto no ha cambiado, ni lo hará. Los clientes pueden anular las métricas de línea utilizando especificadores de estilo de párrafo o estilos de texto de iOS 7, por ejemplo [UIFont preferredFontForTextStyle: UIFontTextStyleBody].

+0

Si no le importa, me gustaría ver su respuesta de iOS 5 en los foros de desarrolladores (hasta que pueda publicarla aquí). –

+0

ESPERA ENTREGAR PARA ENTREGAR. – mxcl

3

De forma similar al espacio entre cada letra en idiomas europeos, la escritura china utiliza un espacio estrecho entre caracteres, aunque no observa el equivalente al espacio más ancho entre palabras, excepto en raras ocasiones. (En este sentido, puede parecerse a una forma de scriptio continua.) Cuando se usa espacio, también es de ancho completo. Una instancia de su uso es como un marcador honorífico. Un ejemplo moderno en Taiwán, se encuentra en la referencia a Chiang Kai-shek como 先 總統 蔣公 (Ex Presidente, Lord Chiang), en el cual el espacio anterior sirve como un marcador honorífico para 蔣公. Este uso también es actual en cartas muy formales u otros documentos antiguos. Cuando el chino está escrito en forma transliterada (como en Hanyu Pinyin), los espacios se utilizan para ayudar en la lectura. fuente: http: //en.wikipedia.org/wiki/Chinese_punctuation

Así que es porque en chino como el espacio se usa un poco diferente que en inglés.

1

El motivo del espacio depende de los caracteres, como podría encontrarse al consultar partes de texto para su dimensión, pero esto no declara por qué una etiqueta simplemente ignora este problema.

Sin embargo, el espacio es introducido por FrameSetter para lograr un espacio parejo; puede usar FrameSetter para obtener los saltos de línea y usar TypeSetter (CTTypesetterCreateWithAttributedString) para producir las líneas y señalarlas a una distancia de línea deseada, como se muestra en el Manual Line Break from Apple. Esto también funciona para su muestra dada, como he comprobado brevemente.

De todos modos, solo podía aceptar que el comportamiento de la etiqueta es de alguna manera extraño, pero no tan malo como se ve mejor.

Cuestiones relacionadas