cocoa nstextview

cocoa - ¿Cómo redimensionar NSTextView de acuerdo a su contenido?



(4)

Basado en la respuesta de @Peter Hosey, aquí hay una extensión de NSTextView en Swift 4.2:

extension NSTextView { var contentSize: CGSize { get { guard let layoutManager = layoutManager, let textContainer = textContainer else { print("textView no layoutManager or textContainer") return .zero } layoutManager.ensureLayout(for: textContainer) return layoutManager.usedRect(for: textContainer).size } } }

Estoy tratando de establecer una cadena atribuida dentro de NSTextView. Quiero aumentar su altura en función de su contenido, inicialmente se establece en un valor predeterminado.

Así que probé este método:

Configuré el contenido en NSTextView. Cuando configuramos algún contenido en NSTextView, su tamaño aumenta automáticamente. Así que aumenté la altura de su súper vista que es NSScrollView a su altura, pero NSScrollView no se está redimensionando por completo, se muestra el desplazamiento a la derecha.

float xCoordinate = 15.0; [xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, 10.0)]; [[xContentView textStorage] setAttributedString:xContents]; float xContentViewScrollerHeight = [xfContentView frame].size.height + 2; [xContentViewScroller setFrame:NSMakeRect(xCoordinate, 0.0, 560.0, xContentViewScrollerHeight)];

¿Alguien puede sugerirme alguna forma o método para resolver este problema. Al hacer una búsqueda en Google, encontré que en UITextView hay un método contentSize que puede obtener el tamaño de su contenido, traté de encontrar un método similar en NSTextView pero no obtuve ningún éxito :(



+ (float)heightForString:(NSString *)myString font:(NSFont *)myFont andWidth:(float)myWidth andPadding:(float)padding { NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:myString]; NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)]; NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; [layoutManager addTextContainer:textContainer]; [textStorage addLayoutManager:layoutManager]; [textStorage addAttribute:NSFontAttributeName value:myFont range:NSMakeRange(0, textStorage.length)]; textContainer.lineFragmentPadding = padding; (void) [layoutManager glyphRangeForTextContainer:textContainer]; return [layoutManager usedRectForTextContainer:textContainer].size.height; }

Hice la función usando esta referencia: Documentation

Ejemplo:

float width = textView.frame.size.width - 2 * textView.textContainerInset.width; float proposedHeight = [Utils heightForString:textView.string font:textView.font andWidth:width andPadding:textView.textContainer.lineFragmentPadding];


NSTextView *textView = [[NSTextView alloc] init]; textView.font = [NSFont systemFontOfSize:[NSFont systemFontSize]]; textView.string = @"Lorem ipsum"; [textView.layoutManager ensureLayoutForTextContainer:textView.textContainer]; textView.frame = [textView.layoutManager usedRectForTextContainer:textView.textContainer];