首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >计算字体大小以适合框架-核心文本- NSAttributedString - iOS

计算字体大小以适合框架-核心文本- NSAttributedString - iOS
EN

Stack Overflow用户
提问于 2013-12-09 18:47:42
回答 12查看 24.5K关注 0票数 24

我有一些文本,我正在绘制成一个固定的框架通过NSAttributedString (代码如下)。目前,我正在将文本大小硬编码为16。我的问题是,对于给定的框架,有没有一种方法可以计算出文本的最佳大小?

代码语言:javascript
复制
- (void)drawText:(CGContextRef)contextP startX:(float)x startY:(float)
y withText:(NSString *)standString
{
    CGContextTranslateCTM(contextP, 0, (bottom-top)*2);
    CGContextScaleCTM(contextP, 1.0, -1.0);

    CGRect frameText = CGRectMake(1, 0, (right-left)*2, (bottom-top)*2);

    NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:standString];
    [attrString addAttribute:NSFontAttributeName
                      value:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]
                      range:NSMakeRange(0, attrString.length)];

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attrString));
    struct CGPath * p = CGPathCreateMutable();
    CGPathAddRect(p, NULL, frameText);
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0,0), p, NULL);

    CTFrameDraw(frame, contextP);
}
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2013-12-09 19:02:47

我认为唯一可能的方法是让系统运行大小计算,然后调整大小并重复,直到找到合适的大小。

即,设置介于特定大小之间的二等分算法。

例如,运行它的大小为10。太小了。20号,太小了。30码。太大了。25码。太小了。27码。恰到好处,使用27码。

你甚至可以从几百个开始。

100号的。太大了。50码。等等。

票数 8
EN

Stack Overflow用户

发布于 2014-10-03 23:06:48

下面是一段简单的代码,它将计算出适合框架边界的最大字体大小:

代码语言:javascript
复制
UILabel *label = [[UILabel alloc] initWithFrame:frame];
label.text = @"Some text";
float largestFontSize = 12;
while ([label.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:largestFontSize]}].width > modifierFrame.size.width)
{
     largestFontSize--;
}
label.font = [UIFont systemFontOfSize:largestFontSize];
票数 25
EN

Stack Overflow用户

发布于 2016-09-29 02:16:57

一个小技巧有助于使用sizeWithAttributes:,而不需要迭代以获得正确的结果:

代码语言:javascript
复制
NSSize sampleSize = [wordString sizeWithAttributes:
    @{ NSFontAttributeName: [NSFont fontWithName:fontName size:fontSize] }];
CGFloat ratio = rect.size.width / sampleSize.width;
fontSize *= ratio;

确保样本的fontSize足够大,以获得良好的结果。

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

https://stackoverflow.com/questions/20468641

复制
相关文章

相似问题

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