首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算NSAttributedString文本大小

如何计算NSAttributedString文本大小
EN

Stack Overflow用户
提问于 2015-09-19 01:47:21
回答 1查看 1K关注 0票数 1

我想要计算NSAttributedString文本大小。但我不能。

代码语言:javascript
复制
```javascript

-> getTextSize(视图宽度:CGFloat,填充:CGFloat) func CGSize {

代码语言:javascript
复制
var size:CGSize = CGSizeZero
代码语言:javascript
复制
if let s:CGSize = self.makeSize(viewWidth) {
代码语言:javascript
复制
    size = CGSize(width: s.width, height: s.height + padding)
代码语言:javascript
复制
}
代码语言:javascript
复制
return size

}

// MARK: private

func makeSize(宽度:CGFloat) -> CGSize?{

代码语言:javascript
复制
var size:CGSize? = nil
代码语言:javascript
复制
if self.respondsToSelector("boundingRectWithSize:options:context:") {
代码语言:javascript
复制
    let bounds:CGSize = CGSize(width: width, height: CGFloat.max)
代码语言:javascript
复制
    let rect:CGRect = self.boundingRectWithSize(bounds, options:.UsesLineFragmentOrigin, context: nil)
代码语言:javascript
复制
    size = CGSize(width: rect.size.width, height: rect.size.height)
代码语言:javascript
复制
}
代码语言:javascript
复制
return size

}

让catchcopy!.stringByReplacingOccurrencesOfString(" ",= no_multi_catchcopy withString:“")

代码语言:javascript
复制
    //行間
代码语言:javascript
复制
    let attributedText = NSMutableAttributedString(string: no_multi_catchcopy)
代码语言:javascript
复制
    let paragraphStyle = NSMutableParagraphStyle()
代码语言:javascript
复制
    paragraphStyle.lineSpacing = 5
代码语言:javascript
复制
    paragraphStyle.lineBreakMode = NSLineBreakMode.ByTruncatingTail
代码语言:javascript
复制
    attributedText.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedText.length))
代码语言:javascript
复制
    let size = attributedText.getTextSize(self.view.bounds.width, padding: 10)
代码语言:javascript
复制

上面的方法忽略了行距。这将返回相同的值。

代码语言:javascript
复制
【短期】★現金ポイントカード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 =UIFont(名称:"HiraKakuProN-W6",大小: 14),下面的代码是另一种方式。

代码语言:javascript
复制
    +(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);

}

字体是日语系统字体。

代码语言:javascript
复制
let font = UIFont(name: "HiraKakuProN-W6", size: 14){

但它可以返回正确的高度,直到2行。如果它有3行,则方法返回与2行相同的值。

这是什么问题?平谷有问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-09-28 18:35:16

如果你有固定的宽度,你可以试试这个:

代码语言:javascript
复制
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参数没有正确的值,您将获得错误的高度。

此外,如果没有字体,则无法正确计算大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32658106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档