计算UILabel文本大小

沙普卡亚

我正在UILabels编程绘图他们从数据库获取大小。所以我不能随便使用sizeToFit我已经实现了UILabels以通过比例重绘的函数因此,我需要找到的只是UILabel我认为需要重新绘制最大比例的文本UILabels所以最后我需要做这样的事情:

    double ratio = 1.00;
    for (UILabel* labels in sec.subviews) {

        float widthLabel = labels.frame.size.width;
        float heightLabel = labels.frame.size.height;
        float heightText = //get the text height here
        float widthText = //get the text width here
        if (widthLabel < widthText) {
            ratio = MAX(widthText/widthLabel,ratio);
        }
        if (heightLabel < heightText) {
            ratio = MAX(heightText/heightLabel, ratio);
        }
    }
    //redraw UILabels with the given ratio here

那么,如何获得文本的高度和宽度大小,因为我的某些文本无法放入标签中,因此我不能简单地使用标签范围?我正在使用Xcode 5和iOS 7。

沙普卡亚

问题所在

CGRect r = [text boundingRectWithSize:CGSizeMake(200, 0)
                              options:NSStringDrawingUsesLineFragmentOrigin
                           attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
                              context:nil];

boundingRectWithSize确定CGRect可以具有的最大值。

对于这个问题,我的解决方案是检查它是否超出范围,如果没有超出范围,则文本可以放入标签中。我通过使用循环来做到这一点。

NSString *text = @"This is a long sentence. Wonder how much space is needed?";
CGFloat width = 100;
CGFloat height = 100;
bool sizeFound = false;
while (!sizeFound) {
    NSLog(@"Begin loop");
    CGFloat fontSize = 14;
    CGFloat previousSize = 0.0;
    CGFloat currSize = 0.0;
    for (float fSize = fontSize; fSize < fontSize+6; fSize++) {
        CGRect r = [text boundingRectWithSize:CGSizeMake(width, height)
                                      options:NSStringDrawingUsesLineFragmentOrigin
                                   attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fSize]}
                                      context:nil];
        currSize =r.size.width*r.size.height;
        if (previousSize >= currSize) {
            width = width*11/10;
            height = height*11/10;
            fSize = fontSize+10;
        }
        else {
            previousSize = currSize;
        }
        NSLog(@"fontSize = %f\tbounds = (%f x %f) = %f",
              fSize,
              r.size.width,
              r.size.height,r.size.width*r.size.height);
    }
    if (previousSize == currSize) {
        sizeFound = true;
    }

}
NSLog(@"Size found with width %f and height %f", width, height);

每次迭代后,高度和宽度的大小将增加其值的10%。

我之所以选择6,是因为我不希望标签过于松软。

对于不使用循环的解决方案:

NSString *text = @"This is a long sentence. Wonder how much space is needed?";
CGFloat width = 100;
CGFloat height = 100;

CGFloat currentFontSize = 12;
CGRect r1 = [text boundingRectWithSize:CGSizeMake(width, height)
                              options:NSStringDrawingUsesLineFragmentOrigin
                           attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize+6]}
                              context:nil];

CGRect r2 = [text boundingRectWithSize:CGSizeMake(width, height)
                               options:NSStringDrawingUsesFontLeading
                            attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize+6]}
                               context:nil];

CGFloat firstVal =r1.size.width*r1.size.height;
CGFloat secondVal =r2.size.width*r2.size.height;

NSLog(@"First val %f and second val is %f", firstVal, secondVal);

if (secondVal > firstVal) {
    float initRat = secondVal/firstVal;

    float ratioToBeMult = sqrtf(initRat);

    width *= ratioToBeMult;
    height *= ratioToBeMult;
}

NSLog(@"Final width %f and height %f", width, height);

//for verifying
for (NSNumber *n in @[@(12.0f), @(14.0f), @(17.0f)]) {
    CGFloat fontSize = [n floatValue];
    CGRect r = [text boundingRectWithSize:CGSizeMake(width, height)
                                  options:NSStringDrawingUsesLineFragmentOrigin
                               attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
                                  context:nil];
    NSLog(@"fontSize = %f\tbounds = (%f x %f) = %f",
          fontSize,
          r.size.width,
          r.size.height,r.size.width*r.size.height);
    firstVal =r.size.width*r.size.height;
}

最后一个循环证明较大的字体可以提供较大的尺寸。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据文本调整UILabel的大小

来自分类Dev

UILabel根据文本大小自动调整大小

来自分类Dev

如何使UILabel调整大小以适合文本

来自分类Dev

如何设置UILabel或UITextField文本的大小的动画?

来自分类Dev

更改Xcode中的UIlabel文本大小?

来自分类Dev

使用NSLayoutManager计算文本大小

来自分类Dev

计算具有不同字体类型的UILabel的大小

来自分类Dev

在创建位图之前计算文本大小

来自分类Dev

根据标签文本的大小创建具有动态高度的UILabel

来自分类Dev

通过UIViewRepresentable(如文本)在SwiftUI中调整UILabel的大小以换行

来自分类Dev

如何根据UIlabel文本大小动态调整单元格大小

来自分类Dev

有没有不使用 sizeToFit 计算 UILabel 大小的准确方法?

来自分类Dev

UILabel是UILabel的更新文本

来自分类Dev

如何随着字体大小的变化动态平滑地增加和减少UILabel的文本

来自分类Dev

如何根据有限宽度的文本更改UILabel大小

来自分类Dev

使用动态高度更改UITableViewCell中的UILabel文本长度不能正确调整其大小

来自分类Dev

设置文本以使其适合UILabel的大小并在SWIFT中居中

来自分类Dev

设置文本时会调用哪个UILabel方法,并且它会自动调整大小以适合?

来自分类Dev

如何根据有限宽度的文本更改UILabel大小

来自分类Dev

动态调整大小的UITableViewCell,其中UILabel的文本在一行后被截断

来自分类Dev

如何随着字体大小变化动态平滑地增加和减少UILabel的文本

来自分类Dev

如何调整 UIScrollView 的大小以适应 UILabel 中未知数量的文本?

来自分类Dev

当视图第一次出现时,iPad 的 UILabel 文本大小没有更新

来自分类Dev

根据UITableView单元格内不同屏幕尺寸的文本长度计算UILabel高度

来自分类Dev

UILabel高度计算

来自分类Dev

更改Swift UILabel的文本

来自分类常见问题

迅速。UILabel文本对齐

来自分类Dev

UILabel的动画文本更改

来自分类Dev

UIlabel的文本截断

Related 相关文章

  1. 1

    根据文本调整UILabel的大小

  2. 2

    UILabel根据文本大小自动调整大小

  3. 3

    如何使UILabel调整大小以适合文本

  4. 4

    如何设置UILabel或UITextField文本的大小的动画?

  5. 5

    更改Xcode中的UIlabel文本大小?

  6. 6

    使用NSLayoutManager计算文本大小

  7. 7

    计算具有不同字体类型的UILabel的大小

  8. 8

    在创建位图之前计算文本大小

  9. 9

    根据标签文本的大小创建具有动态高度的UILabel

  10. 10

    通过UIViewRepresentable(如文本)在SwiftUI中调整UILabel的大小以换行

  11. 11

    如何根据UIlabel文本大小动态调整单元格大小

  12. 12

    有没有不使用 sizeToFit 计算 UILabel 大小的准确方法?

  13. 13

    UILabel是UILabel的更新文本

  14. 14

    如何随着字体大小的变化动态平滑地增加和减少UILabel的文本

  15. 15

    如何根据有限宽度的文本更改UILabel大小

  16. 16

    使用动态高度更改UITableViewCell中的UILabel文本长度不能正确调整其大小

  17. 17

    设置文本以使其适合UILabel的大小并在SWIFT中居中

  18. 18

    设置文本时会调用哪个UILabel方法,并且它会自动调整大小以适合?

  19. 19

    如何根据有限宽度的文本更改UILabel大小

  20. 20

    动态调整大小的UITableViewCell,其中UILabel的文本在一行后被截断

  21. 21

    如何随着字体大小变化动态平滑地增加和减少UILabel的文本

  22. 22

    如何调整 UIScrollView 的大小以适应 UILabel 中未知数量的文本?

  23. 23

    当视图第一次出现时,iPad 的 UILabel 文本大小没有更新

  24. 24

    根据UITableView单元格内不同屏幕尺寸的文本长度计算UILabel高度

  25. 25

    UILabel高度计算

  26. 26

    更改Swift UILabel的文本

  27. 27

    迅速。UILabel文本对齐

  28. 28

    UILabel的动画文本更改

  29. 29

    UIlabel的文本截断

热门标签

归档