Setting the same font size for different labels AFTER scaling

前端 未结 1 783
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-14 20:06

I am making an app where I have 3 labels. I am using label auto-shrinking to help adapt the label\'s font size to the device.

These labels are right next to each other,

1条回答
  •  不知归路
    2021-02-14 20:54

    Programatically change UIlabel font size after dynamic resizing. See the example below. Calculate current font size with length of string & font. And then get minimum font size and apply separately for each UILabel

    override func viewWillAppear(_ animated: Bool) {
        let fontSize1 = self.label1.getFontSizeForLabel()
        let fontSize2 = self.label2.getFontSizeForLabel()
        let fontSize3 = self.label3.getFontSizeForLabel()
    
        let smallestFontSize = min(min(fontSize1, fontSize2), fontSize3)
    
        self.label1.font = self.label1.font.withSize(smallestFontSize)
        self.label2.font = self.label2.font.withSize(smallestFontSize)
        self.label3.font = self.label3.font.withSize(smallestFontSize)
    
        self.label1.adjustsFontSizeToFitWidth = false
        self.label2.adjustsFontSizeToFitWidth = false
        self.label3.adjustsFontSizeToFitWidth = false
    }
    

    UILabel Extension

    extension UILabel {
        func getFontSizeForLabel() -> CGFloat {
            let text: NSMutableAttributedString = NSMutableAttributedString(attributedString: self.attributedText!)
            text.setAttributes([NSAttributedStringKey.font: self.font], range: NSMakeRange(0, text.length))
            let context: NSStringDrawingContext = NSStringDrawingContext()
            context.minimumScaleFactor = self.minimumScaleFactor
            text.boundingRect(with: self.frame.size, options: NSStringDrawingOptions.usesLineFragmentOrigin, context: context)
            let adjustedFontSize: CGFloat = self.font.pointSize * context.actualScaleFactor
            return adjustedFontSize
        }
    }
    

    Storyboard

    Output

    0 讨论(0)
提交回复
热议问题