Автоматическое изменение размеров NSTextView и / или NSScrollView
У меня есть NSTextView
внутри NSView
(который используется NSPopover
, не знаю, насколько это актуально), что я пытаюсь изменить размер автоматически и программно (см. заголовок).
Я боролся со многими вещами, а именно:
- Смотря на
NSLayoutManager
а такжеusedRectForTextContainer
которые дают мне ненормальные значения размера (usedRectForTextContainer : {{0, 0}, {0.001, 28}}
) - Изменение
NSScrollView frame
,[NSScrollView contentView]
,[NSScrollView documentView]
- Избавляемся от AutoLayout
Я достиг точки, где я могу изменить размеры моего scollview и моего Popover, но я не могу получить фактическую высоту текста внутри NSTextView.
Любая помощь будет оценена.
-(void)resize
{
//Get clipView and scrollView
NSClipView* clip = [popoverTextView superview];
NSScrollView* scroll = [clip superview];
//First, have an extra long contentSize and ScrollView to test everything else
[popover setContentSize:NSMakeSize([popover contentSize].width, 200)];
[scroll setFrame:(NSRect){
[scroll frame].origin.x,[scroll frame].origin.y,
[scroll frame].size.width,155
}];
NSLayoutManager* layout = [popoverTextView layoutManager];
NSTextContainer* container = [popoverTextView textContainer];
NSRect myRect = [layout usedRectForTextContainer:container]; //Broken
//Now what ?
}
2 ответа
Я до сих пор не знаю, почему я не могу использовать [layout usedRectForTextContainer:container]
, но мне удалось получить NSTextView
Высота с помощью:
-(void)resize
{
//Get glyph range for boundingRectForGlyphRange:
NSRange range = [[myTextView layoutManager] glyphRangeForTextContainer:container];
//Finally get the height
float textViewHeight = [[myTextView layoutManager] boundingRectForGlyphRange:range
inTextContainer:container].size.height;
}
Вот некоторый функциональный код, который я сам проверил на swift. usedRectForTextContainer не сломан, он просто установлен лениво. Чтобы установить его, я вызываю glyphrangefortextcontainer
Я нашел ответ здесь: http://stpeterandpaul.ca/tiger/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html
let textStorage = NSTextStorage(string: newValue as! String)
let textContainer = NSTextContainer(size: NSSize(width: view!.Text.frame.width, height:CGFloat.max))
let layoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
textContainer.lineFragmentPadding = 0.0
textContainer.lineBreakMode = NSLineBreakMode.ByWordWrapping
textStorage.font = NSFont(name: "Times-Roman", size: 12)
layoutManager.glyphRangeForTextContainer(textContainer)
let rect = layoutManager.usedRectForTextContainer(textContainer)
Swift.print(rect)
Документация также предполагает, что это так: