2010-12-18 17 views

Respuesta

9

Es un dolor absoluto, pero se puede hacer.

que necesita para obtener todas las líneas en el marco usando CTFrameGetLines(), comprobar si su rango de personaje está en el rango que está buscando usando CTLineGetStringRange(), utilice CTLineGetTypographicBounds() para encontrar lo grande que la propia línea haría que como, y el uso CTLineGetOffsetForStringIndex() para determinar la posición real del carácter de inicio/final del rango (si la línea es solo un subintervalo del rango deseado).

Combinando todo esto y sumando compensaciones y alturas, puede obtener lo que desea. Tenga en cuenta que CTLineGetImageBounds() no funciona sin un contexto de gráficos (y, por lo que veo, es bastante caro de todos modos) y no es necesario para resolver este problema.

+0

¡Una respuesta detallada, muchas gracias! Siempre es un dolor encontrar todas las funciones que se requieren para cosas como esta. :) – Joshua

+1

@Joshua ¿puedes compartir tu código cuando implementes esta respuesta? Creo que tengo un problema y no puedo resolverlo hasta 3 semanas, ayúdame, por favor ... –

+0

@Risma En realidad, nunca pude implementar esto, pero todo lo que necesitas es la respuesta de Sean. – Joshua

2

Primero determine la (s) línea (s) en que se encuentra el rango que le interesa. Luego, llame al CTLineGetOffsetForStringIndex() para obtener un desplazamiento de una posición de cadena específica desde el inicio de la línea. Junto con CTLineGetImageBounds(), debería ser posible calcular una posición CGPoint del primer y último caracteres en su rango.

Cuestiones relacionadas