tutorial cocoa-touch

cocoa-touch - cocoa touch tutorial



¿Cómo obtengo-[NSString sizeWithFont: forWidth: lineBreakMode:] para que funcione? (2)

Actualicé mi pregunta " Ajustar un UILabel (en el SDK de iPhone) para que quepa? " Con una descripción de mi problema con una solución sugerida, pero no obtuve una respuesta. Tal vez tenga mejores resultados haciendo una nueva pregunta ...

Establecí un punto de interrupción después del siguiente código:

NSString *theText = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature''s God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; CGSize theSize = [theText sizeWithFont:[UIFont systemFontOfSize:17.0f] forWidth:260.0 lineBreakMode:UILineBreakModeWordWrap];

theSize.height es 21 y theSize.width es 231. ¿Qué estoy haciendo mal? Esa altura no puede ser en píxeles ni en número de líneas.

Tenga en cuenta que [UIFont systemFontOfSize:17.0f] está destinado a especificar la fuente predeterminada.

Actualización : Cambié el código a:

CGSize constraintSize; constraintSize.width = 260.0f; constraintSize.height = MAXFLOAT; NSString *theText = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature''s God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; CGSize theSize = [theText sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

theSize.height es 273. Eso se parece más a eso.


Esa altura es en píxeles. Supongo que es truncado, es decir, te da las métricas que verías si configuras este texto en un UILabel con 1 línea.

Intenta usar sizeWithFont:constrainedToSize: y simplemente dale MAXFLOAT para el componente de altura del tamaño.


Como aprende cualquier persona que haya averiguado esto, el método se nombra de manera inapropiada y no concuerda con lo que cabría esperar (eso es una violación del buen diseño de la API, pero como cualquier desarrollador experimentado sabe: la API de Apple no está bien diseñada, perdón). Vale la pena leer: la presentación de Josh Bloch sobre un buen diseño de API.

Posicionaría que deberían cambiarle el nombre (si es que debe mantenerse) y hacer que este sea útil, de modo que no CGSize usando la práctica común de pasar un CGSize con un tamaño que sabes que es demasiado grande.

[someString sizeWithFont:yourFont constrainedToSize:CGSizeMake(maxWidthYouSpecify, self.frame.size.height) lineBreakMode:UILineBreakModeWordWrap];

Alternativamente, esto funcionaría igual de bien:

[someString sizeWithFont:yourFont constrainedToSize:CGSizeMake(maxWidthYouSpecify, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];

Esto es, discutiblemente, cómo debería funcionar la función. (FWIW, CGFLOAT_MAX se define en CGGeometry )

Un lado, pero bastante importante: todos los gráficos Core se ocupan de puntos y no de píxeles.

Un punto no corresponde necesariamente a un píxel en la pantalla.

Esa es una distinción importante que debe entender al tratar con diferentes resoluciones (iPhone 3GS vs 4 vs iPad, etc.). Ver los documentos de Apple y Comando + F para "Puntos vs Píxeles".