programa para pages keynote iwork for descargar apple objective-c macos cocoa

objective c - pages - * Exactamente*cálculo de la altura del texto en Cocoa(para Mac, no para iOS)



pages for windows (5)

¡La respuesta de Vigorouscoding funciona tan bien! ¿Esto es realmente malo? Parece que funciona a la perfección. Finalmente después de pasar muchas horas probando otras soluciones.

Aquí está mi traducción Swift del código:

myTextField.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(FLT_MAX))).height

Por favor, no voten esta respuesta. En su lugar, votó la entrada de vigorouscoding.

¿Cómo puedo calcular la altura de una cadena dentro de una etiqueta particular (NSTextField), para un ancho fijo determinado?

Intenté buscar en Google varios métodos. Intenté este método: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html

Funciona, excepto que la altura se convierte en una línea demasiado corta para cadenas más largas. Por lo tanto, parece haber algunas inexactitudes en los métodos actuales.

También tuve el mismo problema con otro código que busqué en Google.

¿Alguien aquí tiene algún código preciso para encontrar la altura del texto (dado un ancho particular)?



Resolví el problema usando la categoría NS (Atribución) String + Geometrics proporcionada en http://www.sheepsystems.com/sourceCode/sourceStringGeometrics.html Dentro del archivo de encabezado de esa categoría hay una buena explicación de cómo funcionan estas cosas. Específicamente, mencionan que uno debe usar NSTextView en lugar de NSTextField porque es prácticamente imposible obtener una altura precisa para este último.

Por lo tanto, reemplacé mi NSTextField con NSTextView. Primero, hice que mi NSTextView se viera como mi NSTextField con este código:

[textView setEditable:YES]; [textView insertText:someString]; [textView setFont:[NSFont fontWithName:@"Lucida Grande" size:11] range:NSMakeRange(0,[someString length])]; [textView setEditable:NO]; [textView setSelectable:NO];

Luego conseguí la altura con este código:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [textView font],NSFontAttributeName,nil]; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString: [textView string] attributes:attributes]; CGFloat height = [attributedString heightForWidth: [textView frame].size.width];

La altura realmente resulta ser precisa para NSTextView.

Puede que haya omitido algunos detalles menores, pero ya entiendo la imagen. Espero que esto ayude a alguien por ahí.


(una solución en Swift está al final de la publicación)

Intenté todos estos métodos y ninguno funcionó para mí. La forma ''oficial'' (como lo menciona OP) estuvo desactivada la mayor parte del tiempo para mi NSTextField . Cambiar a NSTextView fue imposible debido a que XCode / IB siempre se bloqueaba después de agregar un "NSTextView en un NSScrollView".

Para NSTextField , encontré esta manera fácil de determinar la altura de mi NSTextField pero esto se puede adaptar muy fácilmente al ancho.

CGFloat minHeight = [((NSTextFieldCell *)[yourTextField cell]) cellSizeForBounds:NSMakeRect(0, 0, YOUR_MAX_WIDTH, FLT_MAX)].height;

Este código ha funcionado para todos los casos de prueba que fallaron con los otros métodos. Espero que esto ayude a alguien. Siempre me hace sentir tan malditamente estúpido cuando tomo 2 horas para encontrar la solución a un problema aparentemente fácil.

EDICIÓN LEVE : Tras una inspección más cercana, esto solo funciona si lee el stringValue de stringValue del NSTextField antes de pedirle a la celda que calcule su altura. Así que agregué la siguiente línea sin sentido antes del cálculo real:

[yourTextField setStringValue:yourTextField.stringValue];

Sé que esto es realmente muy malo, pero en este momento ya no me importa. Solo quiero una solución confiable. Siéntase libre de rechazarme o aún mejor : sugerir una mejor solución.

Solución en Swift (¡gracias iphaaw por llamarme así la atención!)

myTextField.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(FLT_MAX))).height


Gracias a iphaaw y Enchilada por esta pequeña y genial solución. Encontré que funcionó tan bien al establecer alturas de fila, etc. que convertí el Swift de iphaaw en un par de extensiones NSTextField. Disfrutar

extension NSTextField { func bestheight(text: String, width: CGFloat) -> CGFloat { self.stringValue = text let getnumber = self.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(FLT_MAX))).height return getnumber } } extension NSTextField { func bestwidth(text: String, height: CGFloat) -> CGFloat { self.stringValue = text let getnumber = self.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), CGFloat(FLT_MAX), height)).width return getnumber } }

Espero que alguien encuentre estos útiles. respeta KGH