gpt4 book ai didi

objective-c - 测量 cocoa 中的绳子高度

转载 作者:行者123 更新时间:2023-12-03 17:05:49 25 4
gpt4 key购买 nike

我正在寻找一个高度测量字符串程序,我在另一个堆栈溢出问题上找到了这个程序。它非常适合我的 NSTableViewColumns,它具有自动换行作为换行符我的问题是,如果我将换行符更改为字符换行会怎样,如何更新此代码?

- (NSSize)sizeForWidth:(float)width 
height:(float)height {
NSSize answer = NSZeroSize ;
gNSStringGeometricsTypesetterBehavior = NSTypesetterBehavior_10_2_WithCompatibility;
if ([self length] > 0) {
// Checking for empty string is necessary since Layout Manager will give the nominal
// height of one line if length is 0. Our API specifies 0.0 for an empty string.
NSSize size = NSMakeSize(width, height) ;
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:size] ;
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:self] ;
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init] ;
[layoutManager addTextContainer:textContainer] ;
[textStorage addLayoutManager:layoutManager] ;
[layoutManager setHyphenationFactor:0.0] ;
if (gNSStringGeometricsTypesetterBehavior != NSTypesetterLatestBehavior) {
[layoutManager setTypesetterBehavior:gNSStringGeometricsTypesetterBehavior] ;
}
// NSLayoutManager is lazy, so we need the following kludge to force layout:
[layoutManager glyphRangeForTextContainer:textContainer] ;

answer = [layoutManager usedRectForTextContainer:textContainer].size ;
[textStorage release] ;
[textContainer release] ;
[layoutManager release] ;

// In case we changed it above, set typesetterBehavior back
// to the default value.
gNSStringGeometricsTypesetterBehavior = NSTypesetterLatestBehavior ;
}

return answer ;
}

最佳答案

这感觉就像您正在重新发明[NSAttributedStringboundingRectWithSize:options:](或只是size)。我在你的实现中遗漏了一些东西吗? NSLayoutManager 用于处理快速变化的字符串布局(例如在 TextView 中)。大多数时候,这是多余的。您故意绕过它的优化(在您的行中注意到 NSLayoutManager 是懒惰的,您的意思是优化:D)

无论哪种情况,要更改包装行为,您都需要修改 NSAttributedString 本身。包装是 paragraph style 的一部分。像这样的东西(未经测试;可能无法编译):

// Lazy here. I'm assuming the entire string has the same style
NSMutableParagraphStyle *style = [[self attribute:NSParagraphStyleAttributeName atIndex:0 effectiveRange:NULL] mutableCopy];
[style setLineBreakMode:NSLineBreakByCharWrapping];
NSAttributedString *charWrappedString = [self mutableCopy];
[charWrappedString setAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, [self length]];

NSRect boundingRect = [self boundingRectWithSize:NSMakeSize(width, height) options:0];
NSSize size = boundRect.size;

[style release];
[charWrappedString release];

return size;

样式有点棘手,因为它们包含多种内容,但您必须将它们全部设置在一起。因此,如果属性字符串中有不同的样式,则必须循环该字符串,处理每个 effectiveRange 。 (您需要阅读文档以了解 attributesAtIndex: effectiveRange:attributesAtIndex:longestEffectiveRange:inRange: 之间的权衡。)

关于objective-c - 测量 cocoa 中的绳子高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8945040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com