我想计算NSAttributedString的文字大小。 但我无法做到。
```
func getTextSize(viewWidth:CGFloat, padding:CGFloat) -> CGSize {
var size:CGSize = CGSizeZero
if let s:CGSize = self.makeSize(viewWidth) {
size = CGSize(width: s.width, height: s.height + padding)
}
return size
}
// MARK: private
func makeSize(width:CGFloat) -> CGSize? {
var size:CGSize? = nil
if self.respondsToSelector("boundingRectWithSize:options:context:") {
let bounds:CGSize = CGSize(width: width, height: CGFloat.max)
let rect:CGRect = self.boundingRectWithSize(bounds, options:.UsesLineFragmentOrigin, context: nil)
size = CGSize(width: rect.size.width, height: rect.size.height)
}
return size
}
let no_multi_catchcopy = catchcopy!.stringByReplacingOccurrencesOfString(" ", withString: " ")
//行間
let attributedText = NSMutableAttributedString(string: no_multi_catchcopy)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 5
paragraphStyle.lineBreakMode = NSLineBreakMode.ByTruncatingTail
attributedText.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedText.length))
let size = attributedText.getTextSize(self.view.bounds.width, padding: 10)
```
以上方式忽略了行间距。 这将返回相同的值。
【短期】★現金ポイントカードPRスタッフ募期】★現金ポイントカードPRスタッフ募\351\233集★(チラシ配布&ご案内)【東急沿線期】★現金ポイントカードPRスタッフ募\351\233集★(チラシ配布&ご案内)【東急沿線\343の駅構内】
(314.869921875, 28.8)
イベントスタッフ募集!一緒に盛り上げませんか??
(285.24, 28.8)
イベントスタッフ募集!一緒に盛り上げませんか??
(285.24, 28.8)
必見!!9/20 日給7時間で¥8,500!OMMで什器移動作業♪
(297.41015625, 28.8)
必見!!9/20 日給7時間で¥8,500!OMMで什器移見!!9/20 日給7時間で¥8,500!OMMで什器移\345\213動作業♪
(297.41015625, 28.8)
10/1~10/3(木金土)企業イベント運営
(213.6309375, 28.8)
10/1~10/3(木金土)企業イベント運営
(213.6309375, 28.8)
♪絵画催事の受付業務♪
(120.046875, 28.8)
UIFont是let font = UIFont(名称:" HiraKakuProN-W6",大小:14) 顺便说一下,下面的代码是另一种方式。
+(CGFloat)heightForAttributedString:(NSAttributedString *)attrString forWidth:(CGFloat)inWidth
{
CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString((CFAttributedStringRef)attrString);
CGFloat width = inWidth;
CFIndex offset = 0, length;
CGFloat y = 0;
do {
length = CTTypesetterSuggestLineBreak(typesetter, offset, width);
CTLineRef line = CTTypesetterCreateLine(typesetter, CFRangeMake(offset, length));
CGFloat ascent, descent, leading;
CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
CFRelease(line);
offset += length;
y += ascent + descent + leading;
} while (offset < [attrString length]);
CFRelease(typesetter);
return ceil(y);
}
字体是日文系统字体。
let font = UIFont(name: "HiraKakuProN-W6", size: 14){
但它可以返回正确的高度,直到2行。 如果它有3行,则方法返回与2行相同的值。
这是什么问题? Hirakaku有问题吗?
答案 0 :(得分:0)
如果您已固定宽度,则可以尝试以下操作:
NSAttributedString *attributedStr = ... // your attributed string
CGFloat width = 300; // whatever your desired width is
CGRect rect = [attributedStr boundingRectWithSize:CGSizeMake(width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
没有正确的options参数值,您会得到错误的高度。
此外,如果没有字体,就无法正确计算大小。