1

我有一个给定的视图宽度大小(例如 450,我从中得到viewWidth = rectOftable.size.width;),其中 rectOftable 是具有内容视图大小(宽度和高度)的矩形。现在,我创建了一个包含一个字符串的 NSAttributedString,它的大小可能大于 450(例如 1100 )。

我需要做的是将此 NSAttributedString 拆分为相对于给定宽度的多个子字符串(此处为 450,即视图的大小)。所以,这里需要显示 1100/450 = 2+1 行。

目前,我可以做的是仅按长度拆分 NSAttributedString,即[attrStr attributedSubstringFromRange:NSMakeRange(startIndex, 170)] 这里的 170 是当前长度,但大小是 1100。

如何改为按宽度拆分 NSAttributedString?没有任何关于此的参考。

4

2 回答 2

1

下面是使用 NSTextContainer(例如 [NSTextView textContainer])的方法:

// remember the orginal values
BOOL widthTracksTextView = [textContainer widthTracksTextView];
BOOL heightTracksTextView = [textContainer heightTracksTextView];
NSSize containerSize = [textContainer containerSize];
CGFloat lineFragmentPadding = [textContainer lineFragmentPadding];

// set these as we need them
[textContainer setWidthTracksTextView:NO];
[textContainer setHeightTracksTextView:NO];
[textContainer setContainerSize:screenFrame.size];
[textContainer setLineFragmentPadding:0.0];

// this cause glyph generation and layout
(void) [textView.layoutManager glyphRangeForTextContainer:textContainer];

// return the size that the view would need to be in order to display
// all the glyphs that are currently laid into the container
NSRect layoutRect = [textView.layoutManager usedRectForTextContainer:textContainer];
layoutRect.size.width = ceil(layoutRect.size.width);
layoutRect.size.height = ceil(layoutRect.size.height);

// restore orginal values
[textContainer setContainerSize:containerSize];
[textContainer setWidthTracksTextView:widthTracksTextView];
[textContainer setHeightTracksTextView:heightTracksTextView];
[textContainer setLineFragmentPadding:lineFragmentPadding];
于 2013-06-10T15:44:20.770 回答
0

您要问的是一个复杂的问题;给定空间的大小取决于字体、字体大小和其他因素,所有这些都可能随NSAttributedString. 这就是 OS X 提供类来处理所有问题的原因;见NSTextView, NSText,NSLayoutManager

你真的需要自己打破文本吗?如果没有,则使用提供的类。如果是,那么你有一些阅读要做!

于 2013-05-29T03:37:40.447 回答