How to calculate actual font point size in iOS 7 (not the bounding rectangle)?

前端 未结 8 1207
一整个雨季
一整个雨季 2020-12-01 15:13

Edit: The linked \"duplicate\" question only deals with calculating text rectangle. I need to calculate actual font size after label scaled it, NOT the string size.<

8条回答
  •  一向
    一向 (楼主)
    2020-12-01 15:36

    Expanding on Ferran's answer

    To expand to fill width or height, whichever it hits first

    Swift version

    func getFontSizeToFitFrameOfLabel(label: UILabel) -> CGFloat
    {
        var initialSize : CGSize = label.text!.sizeWithAttributes([NSFontAttributeName : label.font])
    
        if initialSize.width > label.frame.size.width ||
           initialSize.height > label.frame.size.height
        {
            while initialSize.width > label.frame.size.width ||
                  initialSize.height > label.frame.size.height
            {
                label.font = label.font.fontWithSize(label.font.pointSize - 1)
                initialSize = label.text!.sizeWithAttributes([NSFontAttributeName : label.font])
            }
        } else {
            while initialSize.width < label.frame.size.width &&
                  initialSize.height < label.frame.size.height
            {
                label.font = label.font.fontWithSize(label.font.pointSize + 1)
                initialSize = label.text!.sizeWithAttributes([NSFontAttributeName : label.font])
            }
            // went 1 point too large so compensate here
            label.font = label.font.fontWithSize(label.font.pointSize - 1)
        }
        return label.font.pointSize;
    }
    

    Then do something like this to use it (say your label is named title1Label)

     title1Label.frame = CGRect(x: 0.0, y: 0.0, width: view.frame.size.width, height: view.frame.size.height)
     // sets font to some nonzero size to begin with, it will change up or down to fit the label's frame
     title1Label.font = UIFont(name: "Super Mario 256", size: 45.0)
     title1Label.font = title1Label.font.fontWithSize(getFontSizeToFitFrameOfLabel(title1Label))
     // resize height to be a little larger than the font height
     title1Label.frame.size.height = title1Label.font.pointSize*1.3
    

    Objective C version:

    - (CGFloat) maxFontSize:(UILabel *)label{
       CGSize initialSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
    
       if (initialSize.width > label.frame.size.width ||
           initialSize.height > label.frame.size.height)
       {
           while (initialSize.width > label.frame.size.width ||
                  initialSize.height > label.frame.size.height)
           {
               [label setFont:[label.font fontWithSize:label.font.pointSize - 1]];
               initialSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
           }
       } else {
           while (initialSize.width < label.frame.size.width &&
                  initialSize.height < label.frame.size.height)
           {
               [label setFont:[label.font fontWithSize:label.font.pointSize + 1]];
               initialSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
           }
           // went 1 point too large so compensate here
           [label setFont:[label.font fontWithSize:label.font.pointSize - 1]];
       }
       return label.font.pointSize;
    }
    

提交回复
热议问题