NSAttributedString的bo​​undingRectWithSize返回错误的大小


151

我正在尝试获取属性字符串的rect,但是boundingRectWithSize调用不尊重我传入的大小,而是返回具有单行高度而不是大高度的rect(这是一个长字符串)。我通过传递一个很大的高度值和0来进行实验,如下面的代码所示,但是返回的rect始终相同。

CGRect paragraphRect = [attributedText boundingRectWithSize:CGSizeMake(300,0.0)
  options:NSStringDrawingUsesDeviceMetrics
  context:nil];

这是坏了吗,还是我需要做其他事情才能让它返回一个用于包装文本的矩形?


5
您是否碰巧具有截断/剪切的段落样式lineBreakMode
danyowdee 2012年

1
如果由于UILabel测量/包装到不正确的宽度而正在阅读此书,请查看stackoverflow.com/questions/46200027/…。具体来说,在应用启动时将NSAllowsDefaultLineBreakStrategy设置为false。
eric

Answers:


312

好像您没有提供正确的选项。对于包装标签,请至少提供:

CGRect paragraphRect =
  [attributedText boundingRectWithSize:CGSizeMake(300.f, CGFLOAT_MAX)
  options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
  context:nil];

注意:如果原始文本宽度小于300.f,则不会进行换行,因此请确保装订大小正确,否则仍然会得到错误的结果。


25
每个人都需要看这个答案,因为它可以工作。通常,此方法和属性字符串可能需要更清晰的文档。您需要看的地方并不明显。
macserv

31
注意!它并不总是有效!有时返回的宽度大于size参数的宽度。甚至Apples的方法文档都指出:“您在size参数中指定的约束是渲染器如何调整字符串大小的指南。但是,如果需要额外的空间来填充此方法,则此方法返回的实际边界矩形可能会大于约束。呈现整个字符串。”
克拉斯

75
NSAttributedString和boundingRectWithSize的API绝对令人震惊。
malhal 2013年

27
另一个难题是,在段落矩形中返回的高度(可能是宽度)几乎总是小数。因此可能会说高度为141.3。您需要使用from的结果,ceilf(paragraphRect.size.height)以便将其取整。我一直都忘记了这一点,想知道为什么我的标签仍在剪裁。
jamone 2014年

39
我始终将boundingRectWithSize:计算结果包装在CGRectIntegral()中CGRectIntegral rounds the rectangle’s origin downward and its size upward to the nearest whole integers,在这种情况下,将对高度和宽度进行四舍五入,以确保如果高度或宽度为小数值,则不会发生裁剪。
runmad 2014年

47

由于某些原因,boundingRectWithSize总是返回错误的大小。我想出了一个解决方案。UItextView -sizeThatFits有一个方法,该方法返回文本集的正确大小。因此,不要使用boundingRectWithSize,而是创建一个带有随机框架的UITextView,并使用各自的宽度和CGFLOAT_MAX高度调用其sizeThatFits。它返回将具有适当高度的尺寸。

   UITextView *view=[[UITextView alloc] initWithFrame:CGRectMake(0, 0, width, 10)];   
   view.text=text;
   CGSize size=[view sizeThatFits:CGSizeMake(width, CGFLOAT_MAX)];
   height=size.height; 

如果要在while循环中计算大小,请不要忘记将其添加到自动释放池中,因为将创建n个UITextView,因此如果不使用autoreleasepool,应用程序的运行时内存将增加。


1
这可行。我尝试过的其他方式使我永远无法工作。我认为我的问题源于我分配的属性字符串的复杂性。它来自RTF文件,并使用了各种字体,行距,甚至阴影,尽管使用了UsesLineFragmentOrigin和UsesFontLeading,但我始终无法获得足够高的结果,而问题的根源是,问题的根源越长,问题就越严重。我的猜测是,对于相对简单的字符串,boundingRectWithSize方法可能有效。他们确实需要一种更好的方法来处理这个问题。
约翰·布什内尔

您不认为创建一个方法被调用的UITextView时间太多是太过分了heightForRowAtIndexPath吗?这需要时间
亚诺什

我同意@János,但这是唯一对我有用的解决方案。
shoan

顺便说一句,我问了妥善的解决办法:stackoverflow.com/questions/32495744/...
亚诺什

这是唯一可行的解​​决方案。这个问题已经有9年了,Apple显然不想解决这个问题,否则他们的工程师将无力为这个问题找到解决方案。我们在这里谈论的是iOS 11,但仍然存在相同的错误。
Duck

31

埃德·麦克马纳斯(Ed McManus)当然已经提供了使它起作用的关键。我发现一个无效的案例

UIFont *font = ...
UIColor *color = ...
NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                     font, NSFontAttributeName,
                                     color, NSForegroundColorAttributeName,
                                     nil];

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString: someString attributes:attributesDictionary];

[string appendAttributedString: [[NSAttributedString alloc] initWithString: anotherString];

CGRect rect = [string boundingRectWithSize:constraint options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil];

rect将没有正确的高度。注意,另一个String(附加在string上)已初始化,没有属性字典。这是anotherString的合法初始值设定项,boundingRectWithSize:在这种情况下未提供准确的大小。


33
谢谢!事实证明,如果您希望boundingRectWithSize实际起作用,则NSAttributedString的每个部分都必须至少设置了一个NSFontAttributeName和NSForegroundColorAttributeName集合的字典!我在任何地方都看不到该文件。
本·惠勒

3
请注意,似乎还可以将组合在一起以形成单个NSAttributedString的不同NSAttributedString全部都使用SAME词典(并因此使用相同的字体),以便boundingRectWithSize正常工作!
本·惠勒

1
此解决方案与我用于UILabel类别的“缩小以适合”的解决方案非常相似。对于我来说,使它起作用的关键是创建高度为FLT_MAX的边界矩形。没有这个,我似乎只会得到一行矩形。
dre1138 2013年

全场+1。这真的让我受益匪浅,非常感谢你们的努力。
Wex

我有这个问题。我在NSMutableAttributedString没有属性的情况下使用了空格和换行符,但尺寸却错误。
vbezhenar '16

28

经过长时间研究后,我的最终决定是:
- boundingRectWithSize函数仅为连续字符序列返回正确的大小!如果字符串包含空格或其他内容(被Apple称为“某些字形”),则无法获得显示文本所需的rect的实际大小!
我用字母替换了字符串中的空格,并立即得到正确的结果。

苹果在这里说:https : //developer.apple.com/documentation/foundation/nsstring/1524729-boundingrectwithsize

“此方法返回字符串中字形的实际边界。某些字形(例如,空格)被允许与传入的大小所指定的布局约束重叠,因此在某些情况下,返回CGRect的值可以超过size参数的宽度值。”

因此,有必要找到另一种计算实际矩形的方法。


经过漫长的调查过程,解决方案终于找到了!!!我不确定在所有有关的情况下都能正常使用UITextView,但是发现了主要和重要的东西!

boundingRectWithSize函数以及CTFramesetterSuggestFrameSizeWithConstraints(以及许多其他方法)将在使用正确的矩形时计算大小和正确的文本部分。例如- UITextViewtextView.bounds.size.width-这个值由系统当文本借鉴而不是实际的矩形UITextView

我发现了非常有趣的参数,并在代码中执行了简单的计算:

CGFloat padding = textView.textContainer.lineFragmentPadding;  
CGFloat  actualPageWidth = textView.bounds.size.width - padding * 2;

魔术有效-我所有的文字现在计算正确!请享用!


1
是的,我也注意到,它并没有限制宽度,它总是更大。那真的不很酷,他们不赞成使用工作方法,现在我们必须处理这种废话。
鲍里斯·加富罗夫

1
先生,您是我的新英雄!这让我发疯。我正在设置textContainers的inset,因此必须使用textView.textContainer.size.width而不是textView.bounds.size.witdh。

我不能足够投票。奇怪的是,边界计算中没有考虑空格。
大通荷兰

1
用一些虚拟字符(例如“ 3”)替换空格会返回确切的高度
Abuzar Amin

1
这挽救了我的职业生涯以及与质量保证团队的关系。我欠你一个啤酒人!
lucaslt89

14

雨燕四版

let string = "A great test string."
let font = UIFont.systemFont(ofSize: 14)
let attributes: [NSAttributedStringKey: Any] = [.font: font]
let attributedString = NSAttributedString(string: string, attributes: attributes)
let largestSize = CGSize(width: bounds.width, height: .greatestFiniteMagnitude)

//Option one (best option)
let framesetter = CTFramesetterCreateWithAttributedString(attributedString)
let textSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRange(), nil, largestSize, nil)

//Option two
let textSize = (string as NSString).boundingRect(with: largestSize, options: [.usesLineFragmentOrigin , .usesFontLeading], attributes: attributes, context: nil).size

//Option three
let textSize = attributedString.boundingRect(with: largestSize, options: [.usesLineFragmentOrigin , .usesFontLeading], context: nil).size

使用CTFramesetter测量文本效果最佳,因为它可以提供整数大小并且可以很好地处理表情符号和其他unicode字符。


10

这些建议我都不走运。我的字符串包含unicode项目符号点,我怀疑它们在计算中引起了悲伤。我注意到UITextView可以很好地处理图形,因此我希望以此来利用其计算。我做了以下工作,这可能不如NSString绘制方法理想,但至少是准确的。它比初始化UITextView只是稍微好一点-sizeThatFits:

NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(width, CGFLOAT_MAX)];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[layoutManager addTextContainer:textContainer];

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:formattedString];
[textStorage addLayoutManager:layoutManager];

const CGFloat formattedStringHeight = ceilf([layoutManager usedRectForTextContainer:textContainer].size.height);

可能不是Unicode点,可能是字符串末尾的空格。请参阅上面的答案:stackoverflow.com/a/25941139/337934
SamB

9

如果您想通过截尾巴来获得包围盒,此问题可以为您提供帮助。

CGFloat maxTitleWidth = 200;

NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.lineBreakMode = NSLineBreakByTruncatingTail;

NSDictionary *attributes = @{NSFontAttributeName : self.textLabel.font,
                             NSParagraphStyleAttributeName: paragraph};

CGRect box = [self.textLabel.text
              boundingRectWithSize:CGSizeMake(maxTitleWidth, CGFLOAT_MAX)
              options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
              attributes:attributes context:nil];

9

事实证明,如果您希望boundingRectWithSize实际起作用,则NSAttributedString的每个部分都必须至少设置了一个NSFontAttributeName和NSForegroundColorAttributeName集的字典!

我在任何地方都看不到该文件。


谢谢,这是我的解决方案,除了我发现只需要NSFontAttributeName,而不是NSForegroundColorAttributeName
Marmoy

7

@warrenm不好意思说,照排机方法对我不起作用。

我明白了。此函数可以帮助我们确定给定Width下iphone / Ipad SDK中NSAttributedString的字符串范围所需的帧大小:

它可以用于UITableView Cell的动态高度

- (CGSize)frameSizeForAttributedString:(NSAttributedString *)attributedString
{
    CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString((CFAttributedStringRef)attributedString);
    CGFloat width = YOUR_FIXED_WIDTH;

    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 < [attributedString length]);

    CFRelease(typesetter);

    return CGSizeMake(width, ceil(y));
}

感谢HADDAD ISSA >>> http://haddadissa.blogspot.in/2010/09/compute-needed-heigh-for-fixed-width-of.html


在任何设备(iPhone 4和5)上都不适合我。两者都在装有iOS7.1.2的设备和带有iOS8.3的4s Simulator上运行:(
sanjana 2015年

这需要任何导入吗?
jose920405 '16

@KaranAlangat是#import <CoreText/CoreText.h>
jose920405 '16

7

我发现首选解决方案不能处理换行符。

我发现这种方法适用于所有情况:

UILabel* dummyLabel = [UILabel new];
[dummyLabel setFrame:CGRectMake(0, 0, desiredWidth, CGFLOAT_MAX)];
dummyLabel.numberOfLines = 0;
[dummyLabel setLineBreakMode:NSLineBreakByWordWrapping];
dummyLabel.attributedText = myString;
[dummyLabel sizeToFit];
CGSize requiredSize = dummyLabel.frame.size;

就我而言,我应该在后台线程上进行计算,并且不允许使用UI元素
Lubbo

4

我遇到了同样的问题,即使用这些技术无法获得准确的尺寸,因此我改变了方法使其工作。

我有一个很长的属性字符串,我一直试图将其放入滚动视图中,以使其正确显示而不会被截断。为了使文本可靠地工作,我所做的就是根本不将高度设置为约束,而是让固有尺寸接管。现在,文本可以正确显示而不会被截断,而且我也不必计算高度。

我想,如果确实需要可靠地获取高度,我将创建一个隐藏了这些约束的视图,并在应用约束后获取框架的高度。


2
您可以添加一个代码示例来演示这一点吗?谢谢。
内森·布贾

3

我对游戏有点晚了-但我一直在尝试找到一种方法来找到一种边界框,该边界框将适合于属性字符串,从而像在Finder中编辑文件一样创建聚焦环。当字符串末尾有空格或字符串内有多个空格时,我尝试的所有操作均失败。boundingRectWithSize为此惨败CTFramesetterCreateWithAttributedString

NSLayoutManager在我到目前为止发现的所有情况下,使用以下代码似乎都能解决问题,并返回一个完全包围字符串的矩形。奖励:如果选择文本,则选择的边缘将一直上升到返回的矩形的边界。以下代码使用的layoutManager NSTextView

NSLayoutManager* layout = [self layoutManager];
NSTextContainer* container = [self textContainer];

CGRect focusRingFrame = [layout boundingRectForGlyphRange:NSMakeRange(0, [[self textStorage] length]) inTextContainer:container];

2
textView.textContainerInset = UIEdgeInsetsZero;
NSString *string = @"Some string";
NSDictionary *attributes = @{NSFontAttributeName:[UIFont systemFontOfSize:12.0f], NSForegroundColorAttributeName:[UIColor blackColor]};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes];
[textView setAttributedText:attributedString];
CGRect textViewFrame = [textView.attributedText boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.view.frame)-8.0f, 9999.0f) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil];
NSLog(@"%f", ceilf(textViewFrame.size.height));

完美适用于所有字体!


1

我遇到了同样的问题,但是我意识到受限制的高度设置正确。所以我做了以下事情:

-(CGSize)MaxHeighForTextInRow:(NSString *)RowText width:(float)UITextviewWidth {

    CGSize constrainedSize = CGSizeMake(UITextviewWidth, CGFLOAT_MAX);

    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          [UIFont fontWithName:@"HelveticaNeue" size:11.0], NSFontAttributeName,
                                          nil];

    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:RowText attributes:attributesDictionary];

    CGRect requiredHeight = [string boundingRectWithSize:constrainedSize options:NSStringDrawingUsesLineFragmentOrigin context:nil];

    if (requiredHeight.size.width > UITextviewWidth) {
        requiredHeight = CGRectMake(0, 0, UITextviewWidth, requiredHeight.size.height);
    }

    return requiredHeight.size;
}

1
    NSDictionary *stringAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [UIFont systemFontOfSize:18], NSFontAttributeName,
                                      [UIColor blackColor], NSForegroundColorAttributeName,
                                      nil];

    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:myLabel.text attributes:stringAttributes];
    myLabel.attributedText = attributedString; //this is the key!

    CGSize maximumLabelSize = CGSizeMake (screenRect.size.width - 40, CGFLOAT_MAX);

    CGRect newRect = [myLabel.text boundingRectWithSize:maximumLabelSize
                                                       options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                                    attributes:stringAttributes context:nil];

    self.myLabelHeightConstraint.constant = ceilf(newRect.size.height);

我尝试了此页面上的所有内容,但仍有一种情况用于UILabel格式不正确。实际在标签上设置attributedText最终解决了该问题。


1

我注意到的一件事是,从中返回的矩形的(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context宽度将比传递的宽度大。发生这种情况时,我的弦将被截断。我这样解决了:

NSString *aLongString = ...
NSInteger width = //some width;            
UIFont *font = //your font;
CGRect rect = [aLongString boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                        options:(NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin)
                                     attributes:@{ NSFontAttributeName : font,
                                                   NSForegroundColorAttributeName : [UIColor whiteColor]}
                                        context:nil];

if(rect.size.width > width)
{
    return rect.size.height + font.lineHeight;
}
return rect.size.height;

更多内容;我有多行文本,我试图找到合适的高度来显示它。boundRectWithSize有时返回的宽度大于我指定的宽度,因此当我使用过去的宽度和计算出的高度来显示文本时,它会会截断。从测试boundingRectWithSize使用错误的宽度时得出的结果,它会使高度缩短1行。因此,我将检查宽度是否更大,如果是,则添加字体的lineHeight以提供足够的空间来避免截断。


线高如何影响“宽度”?
罗伊穆利亚(Roi Mulia)'18年

@RoiMulia线高不会影响宽度。我更新了答案,以提供更多有关如何解决此错误的信息。
奥德斯

0
    NSAttributedString *attributedText =[[[NSAttributedString alloc]
                                          initWithString:joyMeComment.content
                                          attributes:@{ NSFontAttributeName: [UIFont systemFontOfSize:TextFont]}] autorelease];

    CGRect paragraphRect =
    [attributedText boundingRectWithSize:CGSizeMake(kWith, CGFLOAT_MAX)
                                 options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                 context:nil];
    contentSize = paragraphRect.size;

    contentSize.size.height+=10;
    label.frame=contentSize;

如果标签的框架不加10,则此方法将永远无法工作!希望这可以帮到你!祝你好运。


0
Add Following methods in ur code for getting correct size of attribute string 
1.
    - (CGFloat)findHeightForText:(NSAttributedString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    UITextView *textView = [[UITextView alloc] init];
    [textView setAttributedText:text];
    [textView setFont:font];
    CGSize size = [textView sizeThatFits:CGSizeMake(widthValue, FLT_MAX)];
    return size.height;

}

2. Call on heightForRowAtIndexPath method
     int h = [self findHeightForText:attrString havingWidth:yourScreenWidth andFont:urFont];

就我而言,我应该在后台线程上进行计算,并且不允许使用UI元素
Lubbo

0

我想补充一下自己的想法,因为我遇到了完全相同的问题。

我之所以使用UITextView它,是因为它具有更好的文本对齐方式(对齐,当时尚不可用UILabel),但是为了“模拟”非交互式非滚动式UILabel,我将完全关闭滚动,弹跳和用户交互。

当然,问题在于文本是动态的,尽管宽度是固定的,但是每次我设置新的文本值时都应重新计算高度。

boundingRectWithSize 从我所看到的,这对我来说根本不适合我, UITextView在顶部增加了一些边距,这boundingRectWithSize不会被计算在内,因此,从中检索到的高度boundingRectWithSize比应该的要小。

由于文本不会快速更新,因此仅用于某些信息,这些信息最多每2-3秒更新一次,因此我决定采用以下方法:

/* This f is nested in a custom UIView-inherited class that is built using xib file */
-(void) setTextAndAutoSize:(NSString*)text inTextView:(UITextView*)tv
{
    CGFloat msgWidth = tv.frame.size.width; // get target's width

    // Make "test" UITextView to calculate correct size
    UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, msgWidth, 300)]; // we set some height, really doesn't matter, just put some value like this one.
    // Set all font and text related parameters to be exact as the ones in targeted text view
    [temp setFont:tv.font];
    [temp setTextAlignment:tv.textAlignment];
    [temp setTextColor:tv.textColor];
    [temp setText:text];

    // Ask for size that fits :P
    CGSize tv_size = [temp sizeThatFits:CGSizeMake(msgWidth, 300)];

    // kill this "test" UITextView, it's purpose is over
    [temp release];
    temp = nil;

    // apply calculated size. if calcualted width differs, I choose to ignore it anyway and use only height because I want to have width absolutely fixed to designed value
    tv.frame = CGRectMake(tv.frame.origin.x, tv.frame.origin.y, msgWidth, tv_size.height );
}

*以上代码不是直接从我的源代码中复制的,我必须对其进行调整/从本文不需要的其他内容中清除它。不要将其用于复制粘贴并可以工作的代码。

明显的缺点是,每个调用都有分配和释放。

但是,这样做的好处是,您避免依赖boundingRectWithSize绘制文本和计算文本的大小以及文本绘制的实现之间的兼容性UITextView(或者UILabel也可以只替换UITextViewUILabel)。这样可以避免Apple可能遇到的任何“错误”。

PS似乎您不需要这个“临时”人员UITextView,可以sizeThatFits直接向目标询问,但这对我没有用。尽管逻辑上会说它应该工作,并且UITextView不需要分配/释放临时文件,但事实并非如此。但是对于我要输入的任何文本,此解决方案都可以完美地工作。


就我而言,我应该在后台线程上进行计算,并且不允许使用UI元素
Lubbo

0

好的,所以我花了很多时间调试它。我发现boundingRectWithSize允许显示的最大文本高度UITextView小于框架尺寸。

在我的情况下,框架最多为140pt,但UITextView最多可以容纳131pt。

我必须手动弄清楚,然后对“实际”最大高度进行硬编码。

这是我的解决方案:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSString *proposedText = [textView.text stringByReplacingCharactersInRange:range withString:text];
    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:proposedText];
    CGRect boundingRect;
    CGFloat maxFontSize = 100;
    CGFloat minFontSize = 30;
    CGFloat fontSize = maxFontSize + 1;
    BOOL fit;
    NSLog(@"Trying text: \"%@\"", proposedText);
    do {
        fontSize -= 1;
        //XXX Seems like trailing whitespaces count for 0. find a workaround
        [attributedText addAttribute:NSFontAttributeName value:[textView.font fontWithSize:fontSize] range:NSMakeRange(0, attributedText.length)];
        CGFloat padding = textView.textContainer.lineFragmentPadding;
        CGSize boundingSize = CGSizeMake(textView.frame.size.width - padding * 2, CGFLOAT_MAX);
        boundingRect = [attributedText boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading context:nil];
        NSLog(@"bounding rect for font %f is %@; (max is %f %f). Padding: %f", fontSize, NSStringFromCGRect(boundingRect), textView.frame.size.width, 148.0, padding);
        fit =  boundingRect.size.height <= 131;
    } while (!fit && fontSize > minFontSize);
    if (fit) {
        self.textView.font = [self.textView.font fontWithSize:fontSize];
        NSLog(@"Fit!");
    } else {
        NSLog(@"No fit");
    }
    return fit;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.